Swift fra Scratch: En introduksjon til funksjoner
35
Del
16
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Swift fra Scratch.Swift fra Scratch:. Tilleggsutstyr og kontroll FlowSwift fra Scratch: Funksjonsparametere, typer, og Nesting
For å få noe gjort i Swift, du 'll trenger å lære ins og outs av funksjoner. Funksjoner er usedvanlig kraftig og fleksibel i Swift. Grunnleggende er enkle, spesielt hvis du har jobbet med andre programmeringsspråk før-men på grunn av Swift fleksible syntaks kan det lett bli komplisert hvis du ikke er kjent med det grunnleggende.
I denne artikkelen vil vi ll fokusere på de grunnleggende først og utforske de mer komplekse syntaks og bruksmåter i den neste artikkelen. Det er viktig at du ikke skumme det grunnleggende som de er avgjørende for å forstå hvor en funksjon makt kommer fra i Swift. La oss starte med et eksempel for å dissekere anatomien av en funksjon i Swift.
1. Lære ved eksempel
En funksjon er noe mer enn en blokk med kode som kan kjøres når det er nødvendig. Jeg ønsker å starte med et eksempel for å diskutere de grunnleggende anatomi av en Swift funksjon. Fyr opp Xcode og opprette en ny lekeplass. Legg til følgende funksjonsdefinisjonen til lekeplassen.
Func printHelloWorld () {println ("Hello World!")}
En funksjon begynner med func søkeord og etterfølges av navnet på funksjonen, printHelloWorld i vårt eksempel . Som i mange andre språk, er navnet på funksjonen etterfulgt av et par parenteser som inneholder funksjonens parametre, funksjons innspill.
Liket av funksjonen er pakket inn i et par av klammeparentes. Den printHelloWorld funksjon inneholder én uttalelse der vi skrive ut strengen Hello World! i standard ut. Dette er hva en grunnleggende funksjon ser ut i Swift. Syntaksen er enkel, ren og minimalistisk.
Du kan starte funksjonen ved å skrive inn navnet på funksjonen, etterfulgt av et par parentes.
PrintHelloWorld ()
2. Parametere
La oss gjøre eksemplet ovenfor en litt mer komplisert ved å legge til parameter til funksjonsdefinisjonen. Dette betyr ganske enkelt at vi gir funksjonen med innspill verdier den kan bruke i funksjonen kropp. I følgende eksempel, vi definerer printMessage funksjon, som aksepterer en parameter, melding, av type String
func printMessage. (Message: String) {println (melding)}
En funksjon kan godta flere parametre eller inngangsverdier . Parametrene er pakket av parentesene som følger funksjonens navn. Navnet på parameteren etterfulgt av kolon og parametertypen. Som du husker, er dette svært lik erklære en variabel eller konstant. Den sier bare at meldingen parameter er av type I stedet for å skrive ut en hardkodet streng som vi gjorde i printHelloWorld funksjon, vi skriver ut meldingen parameterverdien. Dette gjør funksjonen fleksibel og mer nyttig. Starte funksjonen er svært likt det vi så tidligere. Den eneste forskjellen er at vi passerer i et argument når påberope funksjonen. Merk at vilkårene parametere og argumenter brukes ofte om hverandre, men det er en subtil, semantisk forskjell i Swift. I Swift, parametre er verdiene angitt i funksjonsdefinisjonen mens argumentene er verdiene som sendes til funksjonen når den startes. Som jeg nevnte tidligere, syntaks av funksjoner er svært fleksibel, og det bør ikke overraske deg at det er fullt mulig å sende flere argumenter til en funksjon. I det neste eksemplet oppretter vi en variant av den printMessage funksjon som tillater oss å skrive ut meldingen flere ganger Selv om navnet på funksjonen er identisk med den opprinnelige printMessage funksjon, er funksjonen type annerledes. Det er viktig at du forstår den forrige setningen. Lese det igjen. Hver funksjon har en type, som består av de typer parameter og returtypen. Vi vil utforske returtyper i et øyeblikk. Funksjoner kan ha samme navn så lenge deres type er forskjellig som vist ved de to foregående funksjonsdefinisjoner Den type den første funksjonen er (String) - >.; (), Mens typen av den andre funksjonen er (String, Int) - > (). Navnet på begge funksjonene er de samme. Ikke bekymre deg om - > symbol. Dens betydning vil bli klart i en liten stund når vi diskuterer retur typer. Den andre printMessage funksjonen definerer to parametre, melding av type String og tider av typen Int. Denne definisjonen illustrerer en av funksjonene Swift har adoptert fra Objective-C, lesbar funksjon /metodenavn. Selv om navnet på funksjonen er printMessage, ved å lese navnene på funksjonens parametre, er det lett å forstå hva funksjonen er ment å gjøre. I den andre printMessage funksjonen, skaper vi et for-i loop til skrive ut melding streng ganger ganger. Vi bruker den halvåpne rekke operatør, .. <, som vi så tidligere i denne serien. Når vi begynner å skrive printMessage på lekeplassen, viser Xcode begge funksjonene i autofullføring menyen. Takket være funksjonstype, er det enkelt å velge funksjonen vi er interessert i Ringe andre printMessage funksjonen er så enkelt som:. En av mine favoritt-funksjoner er muligheten til å definere standardverdier for parametre. Dette høres kanskje dumt hvis du kommer fra et språk som har hatt denne funksjonen i det uendelige, men dette er ganske flott hvis du har jobbet med C og Objective-C i mange år. I korte, Swift lar utviklere å definere standardverdier for parametrene i en funksjon. La oss definere en ny funksjon som skriver ut gjeldende dato i et bestemt format. Sørg for at du legge til følgende import uttalelse på toppen av din lekeplass å importere UIKit rammeverket. La oss først definere printDate funksjon uten å gjøre bruk av standardverdier for noen av parametrene. Hvis du ikke er kjent med stiftelsen rammeverket og du ikke er forstå hva som skjer i funksjonen kroppen, så det er fint. Fokuset i dette eksempelet er ikke om gjennomføringen av formatering av dato. I printDate, bruker vi verdien av formatet parameter å formatere verdien på dato. Hvis vi ikke passere i en verdi for formatet parameter, vil Swift gi oss beskjed ved å kaste en feil. Vi kan bøte på dette ved å definere en standardverdi for funksjonen nest parameter som vist i den oppdaterte funksjonen . definisjon nedenfor Definere en standardverdi er så enkelt som å angi en verdi i listen over parametre i funksjon definisjon. Resultatet er at Swift vil ikke lenger klage og feilen forsvinner Hva om vi ønsker å passere i en verdi for formatet parameter? La oss prøve det ut og se hva Swift forteller oss. Fordi formatet parameter har en standardverdi, og er derfor valgfritt, må vi passere i argumentet navn for å fortelle Swift hva parameter vi henviser til. Reparasjonen er veldig enkelt som du kan se nedenfor Legg merke til at Apple anbefaler å posisjonsrammer med en standardverdi på slutten av listen parametere. Dette er absolutt en god idé og vanlig i de fleste andre programmeringsspråk som støtter valgfrie parametere. Funksjonene vi har sett så langt ikke tilbake noe til oss når vi påkaller dem. La oss gjøre printDate funksjon nyttigere ved å returnere formatert dato som en streng, i stedet for å skrive ut formatert dato innenfra funksjonen. Dette krever to endringer som du kan se nedenfor Det første vi endre er funksjonens definisjon. Etter listen over parametere vi spesifisere returtype, String. Returtypen er innledes med den - > symbol. Hvis du har jobbet med CoffeeScript, da dette vil se kjent. I stedet for å skrive ut formatert dato ved hjelp av println-funksjonen, bruker vi retur nøkkelord for å returnere verdien fra funksjonen. Det er alt vi trenger å gjøre. La oss prøve det ut Vi påberope printDate funksjon, lagre den returnerte verdien i konstant formattedDate, og skrive ut verdien av formattedDate i standard ut. Legg merke til at navnet på den printDate funksjonen ikke lenger gjenspeiler hva den gjør så du kan være lurt å endre det til formatDate. De andre funksjonene vi har definert i denne opplæringen didn 't har en returtype. Når en funksjon ikke har en returtype, er det ikke nødvendig å inkludere - > symbol i funksjonsdefinisjonen. Et par avsnitt tidligere, jeg fortalte deg at ingen av de funksjonene vi hadde definert returnerte verdi for oss. Det er faktisk ikke helt sant. La meg forklare kjedelige detaljer med et eksperiment. Dette er interessant legge til følgende linje i din lekeplass og se hva som skjer.. Swift har ikke et problem at vi lagrer returverdien av printHelloWorld funksjon i en konstant, men det klager over at det ikke er i stand til å antyde hvilken type verdien konstant. Hva er det som skjer her? Hver funksjon i Swift returnerer en verdi, selv om vi ikke definerer en returtype i funksjonsdefinisjonen. Når en funksjon ikke eksplisitt angi en returtype, funksjonen implisitt returnerer Void, noe som tilsvarer en tom tuppel, eller () for kort. Du kan se dette i utgangsruten lekeplassen er som vist i skjermbildet over. Vi kan kvitte seg med de ovennevnte advarsel ved eksplisitt å erklære den type verdi, en tom tuppel. Jeg er enig i at det ikke er veldig nyttig å lagre en tom tuppel i en konstant, men det illustrerer at hver funksjon har en returverdi En annen flott funksjon av Swift er muligheten til å returnere flere verdier fra en funksjon ved å returnere et tuppel. Følgende eksempel illustrerer hvordan dette fungerer. La meg gjenta at det ikke er viktig at du forstår hvordan timeComponentsForDate funksjonen gjør jobben sin. Fokuset er returverdien av timeComponentsForDate funksjon, en tuppel med tre elementer Funksjonen godtar ett argument, en NSDate eksempel, og returnerer en tuppel med tre merkede verdier. Merking av tuppel verdier er bare for enkelhets skyld, er det mulig å utelate etikettene Men, som følgende eksempel illustrerer, merking verdiene av tuppel returneres fra funksjonen er svært praktisk og gjør koden lettere å forstå. It's også mulig å returnere en valgfri verdi fra en funksjon hvis det er scenarier der funksjonen har ingen verdi for å gå tilbake. Dette er så enkelt som å definere returtypen til funksjonen som ekstrautstyr som vist nedenfor I denne opplæringen, har vi fokusert på grunnleggende funksjoner i Swift. Det er viktig at du forstår syntaks av funksjoner, for i neste artikkel vil vi utforske mer avanserte funksjoner som bygger på hva vi har dekket i denne opplæringen. Jeg oppfordrer deg til å lese artikkelen igjen om nødvendig, og enda viktigere, skrive noen funksjoner i en lekeplass for å bli kjent med syntaks. Grunnleggende er lett å forstå, men du bare får taket på dem ved å praktisere.
String.
PrintMessage ("Hello World!")
Flere parametere
func printMessage (message: String, tid: Int). {For jeg i 0 .. < ganger {println ( "\\ (i) \\ (melding)")}}
PrintMessage ("Hello World", 3)
Standardverdier
Import UIKit
Func printDate (dato: NSDate, format: String) {la dateFormatter = NSDateFormatter () dateFormatter.dateFormat = format println (dateFormatter.stringFromDate (dato))}
func printDate (dato: NSDate, format: String = "YY /MM /dd") {la dateFormatter = NSDateFormatter () dateFormatter.dateFormat = format println (dateFormatter.stringFromDate (dato))}
. PrintDate (NSDate ())
printDate (NSDate (), format: "dd /MM /ÅÅ").
3. Return Type
func printDate (dato: NSDate, format: String = "YY /MM /dd") - >. String {la dateFormatter = NSDateFormatter () dateFormatter.dateFormat = format retur dateFormatter.stringFromDate (dato)}
la formattedDate = printDate (NSDate (), format: "dd /MM /ÅÅ"). Println (formattedDate)
No Return Type
la verdi:. () = PrintHelloWorld ()
tuples
func timeComponentsForDate (dato: NSDate) - >. (time: Int, minutt: Int, andre: Int) {la dateComponents = NSCalendar.currentCalendar () komponenter ((CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), from. dato). la time = dateComponents.hour la minute = dateComponents .minute la andre = dateComponents.second avkastning (time, minutt, sekund)}
func timeComponentsForDate (dato: NSDate) - >. (Int, Int, Int) {la dateComponents = NSCalendar.currentCalendar () komponenter ((CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), from. Dato). La time = dateComponents.hour la minutters = dateComponents.minute la andre = dateComponents .Andre avkastning (time, minutt, sekund)}
la timeComponents = timeComponentsForDate(NSDate())println(timeComponents.hour)println(timeComponents.minute)println(timeComponents.second)
func timeComponentsForDate (dato: NSDate) - >. (time: Int, minutt: Int, andre: Int)? {La dateComponents = NSCalendar.currentCalendar () komponenter ((CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), from. Dato). La time = dateComponents.hour la minutters = dateComponents.minute la andre = dateComponents.second avkastning (time, minutt , andre)}
Konklusjon