For å få noe gjort i Swift må du lære inn og ut av funksjonene. Funksjonene er svært kraftige og fleksible i Swift. Grunnleggende er enkle, spesielt hvis du har jobbet med andre programmeringsspråk før. Men på grunn av Swifts fleksible syntaks kan funksjoner bli forvirrende hvis du ikke er kjent med det grunnleggende.
I denne artikkelen fokuserer vi først på det grunnleggende. Så fortsetter vi å utforske den mer komplekse syntaksen og bruke saker i neste artikkel. Det er viktig at du ikke skummer på det grunnleggende da de er avgjørende for å forstå hvor en funksjons kraft kommer fra. La oss starte med å dissekere anatomien til en funksjon i Swift med et eksempel.
En funksjon er ikke noe mer enn en blokk med kode som kan utføres når det trengs. La oss se på et eksempel på den grunnleggende anatomien til en Swift-funksjon. Brann opp Xcode og opprett en ny lekeplass. Legg til følgende funksjonsdefinisjon på lekeplassen.
func printHelloWorld () print ("Hello World!")
En funksjon begynner med func
søkeord og følges av navnet på funksjonen, printHelloWorld
i vårt eksempel. Som på mange andre språk, følger navnet på funksjonen et par parenteser som inneholder funksjonens parametere-inngangen til funksjonen.
Funksjonens kropp er pakket inn i et par krøllete bånd. De printHelloWorld ()
funksjonen inneholder en enkelt setning som skriver ut strengen Hei Verden!
til standardutgangen. Slik ser en grunnleggende funksjon ut i Swift. Syntaxen er enkel, ren og minimalistisk.
Du kan påkalle funksjonen ved å skrive navnet på funksjonen, etterfulgt av et par parenteser.
printHelloWorld ()
La oss gjøre eksemplet ovenfor litt mer komplekst ved å legge til parametere i funksjonsdefinisjonen. Dette betyr ganske enkelt at vi gir funksjonen med inngangsverdier det kan bruke i funksjonens kropp. I det følgende eksemplet definerer vi printMessage (melding :)
funksjon, som aksepterer en parameter, budskap
, av type string
.
func printMessage (melding: String) print (message)
En funksjon kan godta flere parametere eller inngangsverdier. Parametrene er innpakket av parentesene som følger funksjonens navn. Navnet på parameteren er etterfulgt av et kolon og parameterens type. Som du husker, er dette veldig likt å erklære en variabel eller konstant. Det sier bare at budskap
parameteren er av type string
.
I stedet for å skrive ut en hardkodd streng som vi gjorde i printHelloWorld ()
funksjon, skriver vi ut budskap
parameterens verdi. Dette gjør funksjonen fleksibel og mer nyttig.
Å påkalle funksjonen er veldig lik det vi så tidligere. Den eneste forskjellen er at vi passerer i et argument når vi påkaller funksjonen.
printMessage (melding: "Hello World!")
Legg merke til at vilkårene parametere og argumenter brukes ofte om hverandre, men det er en subtil, semantisk forskjell i Swift. I Swift er parametrene verdiene som er angitt i funksjonsdefinisjonen, mens argumenter er verdiene som er overført til funksjonen når den påberopes.
Som nevnt tidligere, er funksjons syntaks veldig fleksibel, og det bør ikke overraske deg at det er helt mulig å sende flere argumenter til en funksjon. I det neste eksemplet lager vi en variant på printMessage (beskjed: ganger :)
funksjon som tillater oss å skrive ut meldingen flere ganger.
func printMessage (melding: String, tider: Int) for jeg i 0 ...Mens navnet på funksjonen er identisk med det originale
printMessage (melding :)
funksjon, funksjonens type er forskjellig.Det er viktig at du forstår den forrige setningen. Les det igjen.
Hver funksjon har en type, bestående av parametertyper og returtype. Vi undersøker returtyper på et øyeblikk. Funksjoner kan ha samme navn så lenge deres type er annerledes, som vist i de to foregående funksjonene.
Type av den første funksjonen er
(String) -> ()
, mens typen av den andre funksjonen er(String, Int) -> ()
. Navnet på begge funksjonene er det samme. Ikke bekymre deg for->
symbol. Dens betydning vil bli tydelig om noen øyeblikk når vi diskuterer returtyper.Den andre
printMessage (beskjed: ganger :)
funksjon definerer to parametere,budskap
av typestring
ogganger
av typeint
. Denne definisjonen illustrerer en av funksjonene Swift har vedtatt fra Objective-C, lesbar funksjon og metode navn. Mens navnet på funksjonen erprintMessage
, Det er lett å forstå hva funksjonen skal gjøre ved å lese navnene på funksjonens parametere.I den andre
printMessage (beskjed: ganger :)
funksjon, oppretter vi entil
-i
sløyfe for å skrive utbudskap
stringganger
ganger. Vi bruker halvåpent operatør,... <
, som vi så tidligere i denne serien.Når vi begynner å skrive
printMessage
I lekeplassen viser Xcode begge funksjonene i autofullføringsmenyen. Takket være funksjonens type er det enkelt å velge funksjonen vi er interessert i. Ring på det andreprintMessage (beskjed: ganger :)
funksjonen er så enkel som:printMessage (melding: "Hello World", ganger: 3)Standardverdier
En av mine favorittfunksjoner er muligheten til å definere standardverdier for parametere. Dette kan høres dumt ut hvis du kommer fra et språk som har hatt denne funksjonen i mange år, men dette er ganske bra hvis du har jobbet med C og Objective-C i mange år.
Kort sagt, Swift tillater utviklere å definere standardverdier for parametrene til en funksjon. La oss definere en ny funksjon som skriver ut dagens dato i et bestemt format. Pass på at du legger til følgende importerklæring øverst på lekeplassen din for å importere UIKIT-rammen.
importere UIKitLa oss først definere
printDate (dato: format :)
funksjon uten å bruke standardverdier for noen av parametrene.func printDate (dato: dato, format: streng) let dateFormatter = DateFormatter () dateFormatter.dateFormat = format utskrift (dateFormatter.string (fra: dato))Hvis du ikke er kjent med stiftelsens rammeverk og du ikke forstår hva som skjer i funksjonsdelen, så er det greit. Fokuset i dette eksemplet er ikke på implementeringen av formatering av en dato. I
printDate (dato: format :)
, vi bruker verdien avformat
parameter for å formatere verdien avDato
. Hvis vi ikke sender inn en verdi forformat
parameter, kaster kompilatoren en feil.Vi kan rette opp dette ved å definere en standardverdi for funksjonens andre parameter, som vist i den oppdaterte funksjonsdefinisjonen nedenfor.
func printDate (dato: Dato, format: String = "YY / MM / dd") let dateFormatter = DateFormatter () dateFormatter.dateFormat = format print (dateFormatter.string (fra: dato))Definere en standardverdi er like enkelt som å spesifisere en verdi i listen over parametere i funksjonens definisjon. Resultatet er at kompilatoren ikke lenger klager og feilen forsvinner.
printDate (dato: Dato ())Selv om vi har angitt en standardverdi for
format
parameter, kan vi fortsatt sende inn en verdi hvis vi vil.printDate (dato: Dato (), format: "dd / MM / ÅÅ")Vær oppmerksom på at Apple anbefaler posisjoneringsparametere med en standardverdi på slutten av parameterlisten. Dette er absolutt en god ide og vanlig i de fleste andre programmeringsspråk som støtter valgfrie parametere.
3. Returtype
Funksjonene vi har sett så langt, returnerer ikke noe til oss når vi påberoper dem. La oss lage
printDate (dato: format :)
Fungerer mer nyttig ved å returnere den formaterte datoen som en streng, i stedet for å skrive ut den formaterte datoen i funksjonens kropp. Dette krever to endringer, som du kan se nedenfor.func printDate (dato: Dato, format: String = "YY / MM / dd") -> String let dateFormatter = DateFormatter () dateFormatter.dateFormat = format returdatoFormatter.string (fra: dato)Det første vi endrer er funksjonens definisjon. Etter parameterlisten angir vi returtype,
string
. Retur typen er foran med->
symbol. Hvis du har jobbet med CoffeeScript, så vil dette se kjent ut.I stedet for å skrive ut den formaterte datoen ved hjelp av
print (_: separator: terminator :)
funksjon, bruker vikomme tilbake
søkeord for å returnere verdien fra funksjonen. Det er alt vi trenger å gjøre. La oss prøve det ut.la formattedDate = printDate (dato: Date (), format: "dd / MM / YY") print (formattedDate)Vi påberoper
printDate (dato: format :)
funksjon, lagre den returnerte verdien i konstantenformattedDate
, og skriv ut verdien avformattedDate
i standardutgangen. Legg merke til at navnet påprintDate (dato: format :)
funksjonen gjenspeiler ikke lenger hva den gjør, så du vil kanskje endre den tilformatDate
i stedet.Ingen returtype
De andre funksjonene vi har definert i denne opplæringen, har ikke en returtype. Når en funksjon ikke har en returtype, er det ikke nødvendig å inkludere
->
symbol i funksjonsdefinisjonen.Noen få avsnitt tidligere, jeg fortalte deg at ingen av funksjonene vi hadde definert, ga oss en verdi. Det er egentlig ikke helt sant. La meg forklare nitty-gritty detaljer med et eksperiment. Legg til følgende linje på lekeplassen din og se hva som skjer.
Dette er interessant. Swift har ikke noe problem som vi lagrer returverdien til
printHelloWorld ()
Fungerer i en konstant, men det advarer oss om at typen returverdi ikke er hva vi kanskje tror det er.Hva skjer her? Hver funksjon i Swift returnerer en verdi, selv om vi ikke definerer en returtype i funksjonsdefinisjonen. Når en funksjon ikke spesifiserer en returtype eksplisitt, returnerer funksjonen implisitt
Tomrom
, som tilsvarer en tom tuple, eller()
for kort. Du kan se dette i lekeplassens utgangspanel, og det er også nevnt i advarselen på kompilatorutgangene.Vi kan bli kvitt ovennevnte advarsel ved å erklære eksplisitt typen av
verdi
, en tom tuple. Jeg er enig i at det ikke er veldig nyttig å lagre en tom tuple i en konstant, men det illustrerer for deg at hver funksjon har en returverdi.la verdi: () = printHelloWorld ()tupler
En annen flott funksjon av Swift er evnen til å returnere flere verdier fra en funksjon ved å returnere en tuple. Følgende eksempel illustrerer hvordan dette virker. La meg gjenta at det ikke er viktig at du forstår hvordan
timeComponentsForDate (dato :)
funksjon gjør jobben sin. Fokus er verdien av funksjonen, en tuple med tre elementer.func timeComponentsForDate (_ date: Date) -> (time: Int, minutt: Int, sekund: Int) la dateComponents = Calendar.current.dateComponents ([.time, .minute, .second], fra: dato) = dateComponents.hour let minutt = dateComponents.minute la second = dateComponents.second returnere (time ?? 0, minutt ?? 0, second ?? 0)Funksjonen aksepterer ett argument, a
Dato
eksempel, og returnerer en tuple med tre merkede verdier. Merking av tuples verdier er bare for enkelhets skyld; det er mulig å utelate etikettene.func timeComponentsForDate (_ date: Date) -> (Int, Int, Int) la dateComponents = Calendar.current.dateComponents ([. time, .minute, .second], fra: dato) la time = dateComponents.hour let minutt = dateComponents.minute la second = dateComponents.second returnere (time ?? 0, minutt ?? 0, second ?? 0)Som det følgende eksemplet illustrerer, er merking av verdiene til tupelen som returneres fra funksjonen, veldig praktisk og gjør koden enklere å forstå.
la timeComponents = timeComponentsForDate (Date ()) print (timeComponents.hour) print (timeComponents.minute) print (timeComponents.second)Det er også mulig å returnere en valgfri verdi fra en funksjon hvis det er scenarier der funksjonen har ingen verdi å returnere. Dette er så enkelt som å definere funksjonens returtype som valgfritt, som vist nedenfor.
func timeComponentsForDate (_ date: Date) -> (time: Int, minutt: Int, sekund: Int)? la dateComponents.hour else return nil vakt la minutt = dateComponents.minute else return nil vakt guard nil vakt la andre = dateComponents.second else return nil returnere (time, minutt, sekund)Konklusjon
I denne opplæringen undersøkte vi grunnleggende funksjonene i Swift. Det er viktig at du forstår funksjonens syntaks, for i neste artikkel vil vi utforske mer avanserte funksjoner som bygger på det vi dekket i denne opplæringen.
Jeg oppfordrer deg til å lese artikkelen på nytt om nødvendig, og enda viktigere, skrive noen funksjoner på en lekeplass for å bli kjent med syntaksen. Grunnleggende er lett å forstå, men du får bare henge på dem ved å praktisere.
Hvis du vil lære hvordan du bruker Swift 3 til å kode sanntidsprogrammer, sjekk ut kurset ditt Opprett IOS Apps With Swift 3. Enten du er ny i iOS app-utvikling eller ønsker å skifte bryteren fra Objective-C, dette kurset vil komme i gang med Swift for app utvikling.