Swift fra Scratch: Closures

Swift fra Scratch: Nedleggelser
25
Del
5
Del
Dette Cyber ​​mandag 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:. Funksjonsparametere, typer, og NestingSwift fra Scratch: En introduksjon til Klasser og Structures

Hvis du har jobbet med blokker i C /Objective-C eller lambdaene i Ruby, så du ikke vil ha en hard tid å pakke hodet rundt konseptet med nedleggelser. Nedleggelser er noe mer enn blokker av funksjonalitet som du kan sende inn koden din.

Som et spørsmål om faktum, har vi allerede jobbet med nedleggelser i de to foregående artiklene. Det er riktig. Funksjoner er nedleggelser også. La oss starte med det grunnleggende og inspisere anatomi av en nedleggelse.

1. Hva er en Closure?

Som jeg sa, er en nedleggelse en blokk med funksjonalitet som du kan sende inn koden din. Du kan sende en nedleggelse som et argument til en funksjon, eller du kan lagre det som en egenskap ved et objekt. Nedleggelser har mange bruksmåter.

Navnet nedleggelse
hint på en av de viktigste kjennetegnene ved nedleggelser. En nedleggelse fanger variabler og konstanter av i hvilken sammenheng det er definert. Dette er noen ganger referert til som lukker seg over
de variabler og konstanter. Vi kommer til å se på verdien fange i mer detalj på slutten av denne artikkelen.

Fleksibilitet

Du har allerede lært at funksjoner kan være utrolig kraftig og fleksibel. Fordi funksjonene er nedleggelser, nedleggelser er like fleksibel. I denne artikkelen vil du oppdage hvor fleksibelt og kraftig de er.

Minnestyring

programmeringsspråket C har et lignende konsept, blokker. Nedleggelser i Swift, men har noen fordeler. En av de viktigste fordelene med nedleggelser i Swift er at minnehåndtering er noe du, utvikleren, ikke trenger å bekymre seg for.

Selv beholde sykluser, som ikke er uvanlig i C /Objective-C, håndteres av Swift. Dette vil redusere vanskelig å finne minnelekkasjer eller krasjer på grunn av ugyldige pekere.

2. Syntax

Den grunnleggende syntaksen til en nedleggelse er ikke vanskelig, og det vil minne deg om globale og sammenhengende funksjoner, som vi dekket tidligere i denne serien. Ta en titt på følgende eksempel product: {(a: Int) - >. Int i retur en + 1}

Det første du vil legge merke til er at hele nedleggelsen er pakket inn i et par av klammeparentes. Nedleggelse parametre er pakket inn i et par av parentes, atskilt fra returtypen ved - > symbol. Ovennevnte nedleggelse godtar ett argument, en, av type Int og returnerer en int. Liket av nedleggelsen starter etter i søkeordet.

Oppkalt nedleggelser, det vil si, globale og sammenhengende funksjoner, ser litt annerledes. Følgende eksempel skulle illustrere forskjellene
func tilvekst. (A: Int) - > Int {return a + 1}

Den mest fremtredende forskjell er bruken av funk ordet og posisjonen av parametere og returtype. En nedleggelse starter og slutter med en klammeparentes, innpakning parametrene, returtype, og nedleggelse kroppen. Til tross for disse forskjellene, husk at hver funksjon er en nedleggelse. Ikke alle nedleggelse er en funksjon skjønt.

3. Nedleggelser som parametre

nedleggelser er kraftige og følgende eksempel illustrerer hvor nyttige de kan være. I eksempelet, skaper vi en rekke stater. Vi påberope kartfunksjonen på tabellen for å opprette et nytt utvalg som bare inneholder de to første bokstavene i hver stat som en kapitalisert streng.
Var statene = ["California", "New York", "Texas", "Alaska "] la abbreviatedStates = states.map ({(tilstand: String) - > String i retur state.substringToIndex (forhånd (state.startIndex, 2)) uppercaseString.}) println (abbreviatedStates)

Kartet funksjon eller metode er vanlig i mange programmeringsspråk og biblioteker, som Ruby, PHP og jQuery. I eksempelet ovenfor, er kartfunksjonen startes på statene array, forvandler innholdet, og returnerer en ny array som inneholder de transformerte verdier.

Type Inference

Tidligere i denne serien, vi lært at Swift er ganske smart. La oss se nøyaktig hvor smart. Rekken av stater er en rekke strenger. Fordi vi påberope kartfunksjonen på tabellen, vet Swift at staten argumentet er av typen String. Dette betyr at vi kan utelate den typen som er vist i den oppdaterte eksempelet nedenfor
la forkortelser = states.map ({(stat) - >. String i retur state.substringToIndex (forhånd (state.startIndex, 2)). uppercaseString})

Det er noen flere ting vi kan utelate fra eksemplet ovenfor, noe som resulterer i følgende one-liner.
la forkortelser = states.map ({statlige i state.substringToIndex (forhånd (state.startIndex , 2)). uppercaseString})

La meg forklare hva som skjer. Kompilatoren kan antyde at vi kommer tilbake en streng fra nedleggelsen at vi passerer til kartfunksjon, noe som betyr at det er ingen grunn til å ta den med i nedleggelsen uttrykk definisjon. Vi kan bare gjøre dette hvis nedleggelsen kropp omfatter en enkelt setning skjønt. I så tilfelle, kan vi sette utsagnet på samme linje som lukke definisjon, som vist i eksemplet ovenfor. Fordi det er ingen returtype i definisjonen og nei - > symbol før returtypen, kan vi utelate parentesene omslutter nedleggelse parametere.

Stenografi argumentnavn

Det stopper ikke her skjønt. Vi kan gjøre bruk av stenografi argumentnavn for å forenkle ovenfor nedleggelsen uttrykket enda mer. Ved bruk av en inline lukke uttrykk, som i eksemplet ovenfor, kan vi utelate listen over parametere, blant annet i ordet som skiller parametere fra lukkelegemet.

i lukkelegemet, vi referere argumentene hjelp stenografi argumentnavn Swift gir oss. Det første argumentet er referert av $ 0, den andre av $ 1, etc.

I den oppdaterte eksempelet nedenfor, har jeg utelatt listen over parametere og i søkeord, og erstattet staten argument i nedleggelse kropp med stenografi argument navn $ 0. Den resulterende utsagnet er mer konsis uten at lesbarheten.
La forkortelser = states.map ({$ 0.substringToIndex (forhånd ($ 0.startIndex, 2)). UppercaseString})
Trailing Nedleggelser

Swift programmeringsspråk definerer også et konsept som kalles etterfølgende nedleggelser. Ideen er enkel. Hvis du passerer en nedleggelse som siste argument til en funksjon, kan du plassere at nedleggelse utenfor parentes i funksjonskallet. Følgende eksempel viser hvordan dette fungerer.
La forkortelser = states.map () {$ 0.substringToIndex (forhånd ($ 0.startIndex, 2)). UppercaseString}

Hvis den eneste argument til funksjonen samtalen er nedleggelsen , så er det også mulig å utelate parentes i funksjonskallet.
la forkortelser = states.map {$ 0.substringToIndex (forhånd ($ 0.startIndex, 2)). uppercaseString}

Legg merke til at dette fungerer også for nedleggelser som inneholder flere utsagn. Faktisk er at hovedårsaken følgende nedleggelser er tilgjengelige i Swift. Hvis en nedleggelse er lang eller komplisert, og det er det siste argumentet til en funksjon, er det ofte bedre å bruke den bakre lukke syntaks
la forkortelser = states.map {. (Tilstand: String) - > String i la newstate = state.substringToIndex (forhånd (state.startIndex, 2)) returnerer newState.uppercaseString}
4. Fange Verdier

Når du bruker nedleggelser, vil du ofte finne deg selv bruker eller manipulere konstanter og variabler fra nedleggelsen omliggende sammenheng i kroppen av nedleggelse. Dette er mulig og ofte referert til som verdien fange. Det betyr ganske enkelt at en nedleggelse kan hente verdiene av konstanter og variabler fra konteksten den er definert i Ta følgende eksempel for å bedre forstå begrepet verdi fange
func changeCase (med store bokstaver:.. Bool, strenger: String .. .) - > [String] {var newStrings = [String] () funk changeToUppercase () {for s i strenger {newStrings.append (s.uppercaseString)}} func changeToLowerCase () {for s i strenger {newStrings.append (s.lowercaseString) }} hvis store bokstaver {changeToUppercase ()} else {changeToLowerCase ()} retur newStrings} la uppercaseStates = changeCase (sant, "Califorina", "New York") la lowercaseStates = changeCase (false "Califorina", "New York")

Jeg er sikker på at du godtar eksempelet ovenfor er litt contrived, men det viser tydelig hvordan verdien fange fungerer i Swift. De sammenhengende funksjoner, changeToUppercase og changeToLowercase, har tilgang til den ytre funksjonen argumenter, stater, samt newStates variabel deklarert i den ytre funksjonen. La meg forklare hva som skjer.

changeCase funksjon godtar en boolsk som første argument og en variadic parameter av typen String som sin andre parameter. Funksjonen returnerer en matrise av strenger satt sammen av de strengene som sendes til funksjonen som andre argument. I funksjonen kropp, skaper vi en foranderlig utvalg av strenger, newStrings, der lagrer vi de manipulerte strenger.

Den sammenhengende funksjoner sløyfe over strengene som sendes til changeCase funksjon og endre tilfelle av hver streng . Som du kan se, de har direkte tilgang til de strengene som sendes til changeCase funksjon samt newStrings array, som er erklært i kroppen av changeCase funksjonen.

Vi sjekker verdien av store bokstaver, ring hensiktsmessig funksjon, og returnere newStrings array. De to linjer på slutten av eksemplet viser hvordan changeCase funksjonen fungerer.

Selv om jeg har demonstrert verdien fange med funksjoner, husk at hver funksjon er en nedleggelse. Med andre ord, de samme reglene gjelder for ikke navngitte nedleggelser.

Nedleggelser

Det er blitt nevnt flere ganger i denne artikkelen, funksjonene er nedleggelser. Det finnes tre typer nedleggelser:

globale funksjoner

sammenhengende funksjoner

nedleggelse uttrykk

Globale funksjoner, som for eksempel println funksjon av Swifts standard bibliotek, fange ingen verdier. Sammenhengende funksjoner, men har tilgang til og kan hente verdiene av konstantene og verdier til funksjonen de er definert i. Den forrige eksempel illustrerer dette konseptet.

nedleggelse uttrykk, også kjent som navngitte nedleggelser, kan fange verdier av konstanter og variabler av den konteksten de er definert i. Dette er svært lik sammenhengende funksjoner.

Kopiere og Henvise

En nedleggelse som fanger opp verdien av en variabel er i stand til å endre verdien av denne variabel. Swift er smart nok til å vite om det skal kopiere eller referere verdiene av konstantene og variabler den fanger.

Utviklere som er ny på Swift og har liten erfaring med andre programmeringsspråk vil ta dette problemet for gitt. Men det er en viktig fordel at Swift forstår hvordan fanget verdier blir brukt i en nedleggelse, og som et resultat, kan håndtere minnehåndtering for oss.

Les mer i vår Swift Programmering Course

Hvis du er interessert i å ta din Swift utdanning til neste nivå, kan du ta en titt på vår fulle kurs på Swift utvikling.

Konklusjon

Nedleggelser er et viktig begrep, og du vil bruke dem ofte i Swift. De gjør at du kan skrive fleksibel, dynamisk kode som er enkel både å skrive og forstå. I neste artikkel vil vi utforske objektorientert programmering i Swift, som starter med gjenstander, bygninger og klasser.