Swift 101 - Arbeid med Swifts nye valgfrie verdier

Det swift programmeringsspråket har en ny funksjon som heter alternativene som ikke tidligere var tilgjengelige i Objective-C. De ligner på valgfrie typer i Java og nullable typer i C # programmeringsspråk.

Hvorfor bruk alternativer?

Du kan tenke "Jeg kan ignorere optionsals-det er en funksjon jeg aldri vil bruke", men jeg anbefaler at du leser videre. Du vil finne at du bruke opsjoner i Swift hvis du noen gang trenger en verdi til å være null!

Valgfrie verdier i Swift gjør at du kan være mer presis i koden din ved å la deg spesifisere når det er OK for en bestemt verdi å være tom (og når den ikke er!) Dette hjelper deg med å unngå vanlige programmeringsfeil som oppstår i appen din når den møter en uventet null verdi.

Swifts valgmuligheter hjelper også din apps kode nærmere til å speile evnen du allerede har i Core Data, for å indikere at en bestemt enhedsattributt er valgfritt. Som vist i figur 1, kan du spesifisere typen av et attributt (String, i dette tilfellet), samt angi om verdien er valgfri.

Figur 1 - Du kan spesifisere at en Core Data entity-attributt er valgfritt.

Nå kan Swift du gjøre det samme med dine egenskaper og variabler. Her er en tilsvarende valgfri deklarasjon i Swift:

var middleName: String?

Denne erklæringen lager en variabel som heter middleName av typen String . Spørsmålstegnet ( ? ) Etter variabeltypen String indikerer at middleName- variabelen kan inneholde en verdi som enten kan være en streng eller null . Alle som ser på denne koden, vet umiddelbart at middleName kan være null . Det er selvdokumenterende!

Hvis du ikke angir en innledende verdi for en valgfri konstant eller variabel (som vist ovenfor), blir verdien automatisk satt til null for deg. Hvis du foretrekker det, kan du eksplisitt sette startverdien til null:

var middleName: String? = nil

La oss nå se nærmere på hvordan null er brukt i Swift.

null i Swift

Det kan ikke være åpenbart ved første øyekast, men bare alternativene kan være null . Som nevnt i Apples The Swift Programming Language- bok (tilgjengelig gratis i iBooks Store):

null kan ikke brukes med ikke-valgfrie konstanter og variabler. Hvis en konstant eller en variabel i koden din skal kunne takle fraværet av en verdi under visse forhold, erklærer du det som en valgfri verdi av den aktuelle typen.

Dette betyr at du ikke kan gjøre noe slikt, fordi firstName- variabelen ikke er merket med et spørsmålstegn for å indikere at det er et valgfritt:

var firstName: String = nil

Denne koden gir følgende kompileringstidsfeil:

Type 'String' samsvarer ikke med protokollen 'NilLiteralConvertible' .

Det er også viktig å merke seg at null i Swift er forskjellig fra null i Objective-C. I Objective-C er nil en peker til et ikke-eksisterende objekt. I Swift indikerer null bare mangel på en verdi - det er ikke en peker. Dette betyr at du kan angi opsjoner av enhver type, ikke bare objekttyper.

Tilgang til valgfrie verdier

I motsetning til andre programmeringsspråk, i Swift, kan du ikke få tilgang til en valgfri verdi direkte . Du må pakke ut valgfri først for å få tilgang til den underliggende verdien. Ta for eksempel følgende kode:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

De tre første kodelinjene erklærer en firstName String-variabel, en mellomnavnet String-variabel, og en firstAndMiddleNames String-variabel. Den neste linjen av kode konkluderer (forbinder) de variable variableverdiene firstName og middleName sammen med et mellomrom mellom dem. Du kan bli overrasket over å finne ut at denne linjen med kode genererer følgende kompileringstidsfeil:

Verdi av opsjonstype 'String?' ikke utpakket; mente du å bruke '!' eller '?'?

Dette er en av Swifts beskyttelsesmekanismer. Det tvinger deg til å erkjenne at en verdi kan være null . Så, hvordan pakker du ut en valgfri? Det er to hovedveier som beskrevet i de følgende avsnittene.

Bruke tvunget utpakning for valgmuligheter

Som foreslått av kompilatorfeilen i forrige avsnitt, er en måte å pakke ut en valgfri verdi på, å bruke utropstegnet (!) Etter det valgfrie for å eksplisitt pakke det ut. For eksempel:

firstAndMiddleNames = firstName + " " + middleName!

Dette krever manuelt verdien av den mellomnavnet som er valgfritt for å bli utpakket. Men hvis middleName inneholder en null på kjøretid, vil dette føre til en EXC_BAD_INSTRUCTION kjøretidsfeil. Så, du vil åpenbart ikke ønske å bruke tvunget utpakning med mindre du er helt sikker på at verdien ikke er null .

Bruke Valgfri Binding til å pakke ut alternativer

Du kan bruke en teknikk som kalles valgfri binding for å teste om en valgfri inneholder en verdi, og i så fall lagre den verdien i en midlertidig variabel eller konstant. For å vise hvordan dette fungerer med vårt forrige eksempel, sjekk ut denne koden:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

hvis la middle = middleName

{

firstAndMiddleNames = firstName + "" + middle

}

ellers

{

firstAndMiddleNames = firstName

}

Når om- tilstanden er merket i kjøretid, hvis middleName- variabelen inneholder en String- verdi, vurderer tilstanden til ekte, verdien som er inneholdt i middleName- variabelen, blir pakket ut, lagret i mellomkonstanten og koden i krøllete staver av if- setningen er utført.

Hvis middleName- variabelen inneholder null, vurderer tilstanden til falsk, den valgfrie verdien er ikke utpakket, og koden i de krøllete båndene i den andre setningen utføres.

Implisitt uopppakkede alternativer

Swift har også noe som heter implisitt uåpnede alternativ. Dette er valgmuligheter som ikke trenger å bli utpakket med enten tvunget utpakning (!) Eller valgfri binding fordi de er utpakket implisitt (automatisk). De er erklært med et utropstegn (!) I stedet for et spørsmålstegn (?).

Du ser ofte implisitt uåpnede alternativer når du arbeider med Interface Builder-uttak ( IBOutlet- egenskaper). For eksempel:

@IBOutlet weak var lblDescription: UILabel!

I denne koden har lblDescription outlet-eiendommen et utropstegn etter det, noe som indikerer at det er implisitt utpakket. Dette gir deg tilgang til eiendommen uten å pakke inn den.

I dette eksemplet er ikke utsalgsstedet garantert å inneholde en referanse til en etikett, men det bør absolutt. Hvis den ikke inneholder en referanse til en etikett, betyr det at forbindelsen mellom uttaket og etiketten er brutt. I så fall er det OK å ha en kjøretidsfeil fordi du vil vite at forbindelsen er ødelagt, slik at du kan fikse det!

Selvfølgelig, i tilfeller der du ikke er 100 prosent sikker på at en konstant eller variabel inneholder en verdi, bør du bruke en vanlig valgfri i stedet.

Konklusjon

Alternativer er en flott ny funksjon av Swift som lar deg håndtere null verdier i dine iOS-apper. Jeg anbefaler å vurdere dette innlegget noen ganger for å sikre at du forstår de grunnleggende konseptene, og deretter gå tilbake til Apples The Swift Programming Language- bok for å lære mer om hvordan alternativene brukes i Swift.