Raske valg: Hvordan bruke dem (med eksempler)

I denne artikkelen vil du lære om valgfritt, brukssaker og valgfri håndtering i Swift.

I forrige artikkel lærte vi om forskjellige datatyper som er tilgjengelige i Swift, og la også merke til at variabel eller konstant deklarert av disse typene inneholder en standardverdi.

Eksempel:

 la someValue = Int () skrive ut (someValue) 

Når du kjører programmet, vil utdataene være:

 0

Imidlertid er det en annen datatype i Swift som heter Valgfritt, hvis standardverdi er en nullverdi ( nil). Du kan bruke valgfritt når du vil at en variabel eller konstant ikke inneholder noen verdi i den. En valgfri type kan inneholde en verdi eller fraværende en verdi (en nullverdi).

Ikke teknisk, du kan tenke valgfritt som en skoboks. Skoboksen kan inneholde eller ikke inneholde en sko i den. Så du bør vite på forhånd mens du får tilgang til skoen fra esken.

Hvordan erklære jeg et valgfritt?

Du kan ganske enkelt representere en datatype som valgfri ved å legge til !eller ?til Type. Hvis et valgfritt inneholder en verdi i den, returnerer den verdien som Optional, hvis ikke den returnerer nil.

Eksempel 1: Hvordan erklære du valgfri i Swift?

 var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue) 

Når du kjører programmet, vil utdataene være:

 null null

I programmet ovenfor har vi initialisert en valgfri type ved hjelp av ?og !. Begge måtene er gyldige for å lage et valgfritt, men det er en stor forskjell som vi vil utforske nedenfor.

Å erklære en valgfri Int betyr at variabelen enten vil ha en heltall eller ingen verdi. Siden ingen verdi er tildelt variabelen, kan du se begge printutsagnene nilpå skjermen.

Eksempel 2: Tilordne og få tilgang til en verdi fra et valgfritt

 let someValue:Int? = 5 print(someValue) print(someValue!) 

Når du kjører programmet, vil utdataene være:

 Valgfritt (5) 5 

I programmet ovenfor har vi erklært en valgfri Inttype og tilordnet verdi 5 i den.

Som du kan se, skriver ikke ut det valgfrie som print(someValue)ikke gir deg 5men Optional(5). Det er av den form som er beskrevet ovenfor: Optional. For å få tilgang til fra det, trenger vi en mekanisme som kalles utpakking .

Du kan pakke ut et valgfritt ved å legge til !tegnet på slutten av variabelen / konstanten som i neste linje print(someValue!). print(someValue!)pakker ut tilleggsutstyr og utganger 5på skjermen.

Husk imidlertid at denne typen utpakningsmekanisme bare skal brukes når du er sikker på at det valgfrie sikkert vil ha en verdi når du får tilgang til det.

Eksempel 3: Erklærer eksplisitt en ikke-pakket valgfri

Du kan også opprette et uåpnet valgfritt som:

 let someValue:Int! = 5 print(someValue) 

Når du kjører programmet, vil utdataene være:

 5

I det ovennevnte programmet Int!oppretter du et uåpnet valgfritt, som automatisk pakker ut verdien mens du får tilgang til den, slik at du ikke trenger å legge !karakteren til hver gang .

Vær sikker på at mens du bruker slike valgmuligheter, vil variabelen alltid ha en verdi når du får tilgang til den. Hvis du ikke gjør det, vil du få en dødelig feilkrasj.

Eksempel 4: Fatal feil når du får tilgang til et nullutpakket valgfritt

 var someValue:Int! var unwrappedValue:Int = someValue //crashes due to this line 

Når du kjører programmet, vil du få et krasj som en dødelig feil: uventet funnet null mens du pakker ut en valgfri verdi fordi koden unwrappedValue:Int = someValueprøver å tilordne verdi fra valgfri someValue til variabel unwrappedValue.

Imidlertid er en verdi en Optionaltype som inneholder nilverdi. Hvis du prøver å tilordne nullverdi til variabel unwrappedValue som ikke er valgfri, vil det føre til krasj.

Det er forskjellige teknikker for å håndtere denne saken, som er forklart nedenfor.

Valgfri håndtering

For å kunne bruke verdien av et valgfritt, må det pakkes ut. Bedre måte å bruke valgfri verdi på er betinget utpakking i stedet for å tvinge utpakking med !operatør.

Dette er fordi betinget utpakking spør Sjekk om denne variabelen har en verdi? . Hvis ja, oppgi verdien, ellers håndterer den nullen saken.

Tvert imot sier kraftutpakking Denne variabelen har en verdi mens du bruker den . Derfor, når du tvinger å pakke ut en variabel som er null, vil programmet kaste en uventet funnet null mens du pakker ut et valgfritt unntak og krasjer . Noen av teknikkene for betinget utpakking er forklart nedenfor:

1. Hvis-uttalelse

Du kan bruke if-setningen og sammenligne valgfritt med null for å finne ut om et valgfritt inneholder en verdi eller ikke. Du kan bruke sammenligningsoperatøren "lik" operator ( ==) eller "ikke lik" operator ( !=) i if-setningen.

Eksempel 5: Valgfri håndtering med if else-uttalelse

 var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil ( print("It has some value (someValue!)") ) else ( print("doesn't contain value") ) if someAnotherValue != nil ( print("It has some value (someAnotherValue!)") ) else ( print("doesn't contain value") ) 

Når du kjører programmet, vil utdataene være:

 inneholder ikke verdi Den har en verdi 0 

I det ovennevnte programmet kjører koden inne hvis setningen kjøres hvis en valgfri inneholder en verdi, ellers kjøres setningen i den andre blokken. Den største ulempen med valgfri håndtering ved hjelp av denne teknikken er at du fortsatt trenger å pakke ut verdien fra valgfri ved hjelp av !operatøren.

2. Valgfri binding (if-let)

Optional binding helps you to find out whether an optional contains a value or not. If an optional contains a value, that value is available as a temporary constant or variable. Therefore, optional binding can be used with if statement to check for a value inside an optional, and to extract that value into a constant or variable in a single action.

Example 5: Optional handling using if let statement

 var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) if let temp = someAnotherValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) 

When you run the program, the output will be:

 doesn't contain value It has some value 0 

In the above program, the code inside if statement executes if the optional contains a value. Otherwise the else block gets executed. The if-let statement also automatically unwraps the value and places the unwrapped value in temp constant. This technique has major advantage because you don't need to forcely unwrap the value although being certain an optional contains a value.

3. Guard statement

You can use guard to handle optionals in Swift. Don't worry if you don't know what guard is. For now, just think of guard as an if-else condition with no if block. If the condition fails, else statement is executed. If not, next statement is executed. See Swift guard for more details.

Example 6: Optional handling using guard-let

 func testFunction() ( let someValue:Int? = 5 guard let temp = someValue else ( return ) print("It has some value (temp)") ) testFunction() 

When you run the program, the output will be:

 It has some value 5

In the above program, the guard contains a condition whether an optional someValue contains a value or not. If it contains a value then guard-let statement automatically unwraps the value and places the unwrapped value in temp constant. Otherwise, else block gets executed and and it would return to the calling function. Since, the optional contains a value, print function is called.

4. Nil-coalescing operator

In Swift, you can also use nil-coalescing operator to check whether a optional contains a value or not. It is defined as (a ?? b). It unwraps an optional a and returns it if it contains a value, or returns a default value b if a is nil.

Example 7: Optional handling using nil-coalescing operator

 var someValue:Int! let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

When you run the program, the output will be:

 5

I det ovennevnte programmet er variabel someValue definert valgfri og inneholder nullverdi. Null-koalesceringsoperatøren klarer ikke å pakke ut alternativet, og returnerer derfor defaultValue. Derfor gir uttalelsen print(unwrappedValue)5 i konsollen.

 var someValue:Int? = 10 let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

Når du kjører programmet, vil utdataene være:

 10

I det ovennevnte programmet initialiseres imidlertid den valgfrie variabelen someValue med verdien 10. Så den nule koalescerende operatøren pakker vellykket ut verdien fra someValue. Derfor someValue ?? defaultValuereturnerer setningen 10 og setningen print(unwrappedValue)sender ut 10 i konsollen.

Interessante artikler...