Swift 101 - Arbejder med Swift's nye valgfrie værdier

Swift programmeringssproget har en ny funktion kaldet optionsals, der ikke tidligere var tilgængelige i Objective-C. De ligner valgfrie typer i Java og nullable typer i C # programmeringssprog.

Hvorfor brug valgmuligheder?

Du kan tænke "Jeg kan ignorere optionsals-det er en funktion jeg aldrig bruger", men jeg anbefaler at du læser videre. Du vil opdage, at du skal bruge optionals i Swift, hvis du nogensinde har brug for en værdi til at være nul!

Valgfrie værdier i Swift giver dig mulighed for at være mere præcise i din kode ved at lade dig angive, hvornår det er OK, for en bestemt værdi er tom (og hvis den ikke er!) Dette hjælper dig med at undgå almindelige programmeringsfejl, der opstår i din app, når det møder en uventet nul værdi.

Swifts valgmuligheder hjælper også din apps kode mere spækket med den evne, du allerede har i Core Data, for at angive, at en bestemt enhedsattribut er valgfri. Som vist i figur 1 kan du angive typen af ​​en attribut (String, i dette tilfælde) samt angive, om værdien er valgfri.

Figur 1 - Du kan angive, at en attribut for Core Data entity er valgfri.

Nu giver Swift dig mulighed for at gøre det samme med dine egenskaber og variabler. Her er en tilsvarende frivillig erklæring i Swift:

var middleName: String?

Denne erklæring opretter en variabel med navnet middleName af typen String . Spørgsmålet ( ? ) Efter variabeltypen String angiver, at middleName- variablen kan indeholde en værdi, som enten kan være en streng eller nul . Enhver, der kigger på denne kode, ved straks, at middleName kan være nul . Det er selvdokumenterende!

Hvis du ikke angiver en indledende værdi for en valgfri konstant eller variabel (som vist ovenfor), indstilles værdien automatisk til nul for dig. Hvis du foretrækker det, kan du eksplicit indstille den indledende værdi til nul:

var middleName: String? = nil

Lad os nu se nærmere på, hvordan nil anvendes i Swift.

nul i swift

Det kan ikke være indlysende ved første øjekast, men kun valgmuligheder kan være nul . Som angivet i Apples The Swift Programming Language- bog (tilgængelig gratis i iBooks Store):

nul kan ikke bruges med ikke-valgfrie konstanter og variabler. Hvis en konstant eller variabel i din kode skal kunne klare manglen på en værdi under visse forhold, skal du altid erklære det som en valgfri værdi af den relevante type.

Det betyder, at du ikke kan gøre noget som dette, fordi variablen firstName ikke er markeret med et spørgsmålstegn for at angive, at det er et valgfrit:

var firstName: String = nil

Denne kode producerer følgende kompileringstidsfejl:

Type 'String' overholder ikke protokollen 'NilLiteralConvertible' .

Det er også vigtigt at bemærke, at nil i Swift er forskellig fra nul i Objective-C. I Objective-C er nul en peger på en ikke-eksisterende objekt. I Swift indikerer nul simpelthen manglen på en værdi - det er ikke en pointer. Det betyder, at du kan angive valgmuligheder af enhver type, ikke bare objekttyper.

Adgang til valgfrie værdier

I modsætning til andre programmeringssprog i Swift kan du ikke få adgang til en valgfri værdi direkte . Du skal ompakke fakultetet først for at få adgang til den underliggende værdi. Tag f.eks. Følgende kode:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

De første tre linjer med kode erklærer en firstName String-variabel, en mellemstregsfri String-variabel og en firstAndMiddleNames String-variabel. Den næste linje af kode sammenkæder (forbinder) de variable variableværdier firstName og middleName sammen med et mellemrum mellem dem. Du kan blive overrasket over at finde ud af, at denne kodekode genererer følgende kompileringstidsfejl:

Værdi for optionstype 'String?' ikke udpakket mente du at bruge '!' eller '?'?

Dette er en af ​​Swifts beskyttelsesmekanismer. Det tvinger dig til at erkende, at en værdi muligvis kan være nul . Så, hvordan pakker du et valgfrit? Der er to hovedmåder som beskrevet i de følgende afsnit.

Brug af tvungen ompakning til valgmuligheder

Som foreslået af kompilatorfejlen i det foregående afsnit, er en måde at afpakke en valgfri værdi på at bruge udråbstegn (!) Efter det valgfrie for eksplicit at pakke det ud. For eksempel:

firstAndMiddleNames = firstName + " " + middleName!

Dette tvinger manuelt værdien af ​​den mellemnavne, der er valgfri, til at blive udpakket. Men hvis middleName indeholder en nul på kørselstid, vil dette medføre en EXC_BAD_INSTRUCTION kørselstid fejl. Så du vil selvfølgelig ikke bruge tvungen udpakning, medmindre du er helt sikker på, at værdien ikke er nul .

Brug af valgfri binding til ompakning af valgmuligheder

Du kan bruge en teknik, der kaldes valgfri binding til at teste, hvis en valgfri indeholder en værdi, og i så fald gemme denne værdi i en midlertidig variabel eller konstant. For at vise, hvordan dette virker med vores tidligere eksempel, tjek denne kode:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

hvis lad midten = middleName

{

firstAndMiddleNames = firstName + "" + middle

}

andet

{

firstAndMiddleNames = firstName

}

Når tilstanden if er markeret i løbetid, hvis middleName- variablen indeholder en strengværdi, vurderes tilstanden til ægte, værdien indeholdt i middleName- variablen udpakkes, gemmes i mellemkonstanten og koden inden for krøllede seler af if- sætningen udføres.

Hvis middleName- variablen indeholder nul, vurderes tilstanden til falsk, den valgfrie værdi er ikke udpakket, og koden i de krøllede seler af ellers erklæringen udføres.

Implikt uoppakkede muligheder

Swift har også noget, der kaldes implicit uoppakkede muligheder. Disse er valgmuligheder, der ikke behøver at blive udpakket ved hjælp af enten tvungen udpakning (!) Eller valgfri binding, fordi de ikke er indpakket implicit (automatisk). De erklæres ved hjælp af et udråbstegn (!) I stedet for et spørgsmålstegn (?).

Du ser ofte implicit uoppakkede valgmuligheder, når du arbejder med Interface Builder-udløb ( IBOutlet- egenskaber). For eksempel:

@IBOutlet weak var lblDescription: UILabel!

I denne kode har lblDescription Outlet-ejendommen et udråbstegn efter det, hvilket angiver, at det implicit er uhæmmet. Dette giver dig adgang til ejendommen uden at pakke den ud.

I dette eksempel er udløbsegenskaben ikke garanteret at indeholde en henvisning til en etiket, men det skal absolut. Hvis det ikke indeholder en henvisning til en etiket, betyder det, at forbindelsen mellem stikkontakten og etiketten er blevet brudt. I så fald er det ok at have en run-time-fejl, fordi du vil vide, at forbindelsen er brudt, så du kan rette den!

Det er klart, at i tilfælde hvor du ikke er 100 procent sikker på, at en konstant eller variabel indeholder en værdi, skal du bruge en regelmæssig valgfri i stedet.

Konklusion

Valgmuligheder er et fantastisk nyt træk ved Swift, der giver dig mulighed for sikkert at håndtere nulværdier i dine iOS-apps. Jeg anbefaler at gennemgå dette indlæg et par gange for at sikre dig, at du forstår de grundlæggende begreber, og derefter gå tilbage til Apples The Swift Programming Language- bog for at lære mere om, hvordan valgmuligheder bruges i Swift.