Opcionais rápidos: como usá-los (com exemplos)

Neste artigo, você aprenderá sobre opcionais, seus casos de uso e manuseio opcional em Swift.

No artigo anterior, aprendemos sobre os diferentes tipos de dados disponíveis no Swift e também notamos que a variável ou constante declarada desses tipos contém um valor padrão.

Exemplo:

 deixe someValue = Int () imprimir (someValue) 

Quando você executa o programa, a saída será:

 0

No entanto, há outro tipo de dados em Swift chamado Opcional, cujo valor padrão é um valor nulo ( nil). Você pode usar opcional quando quiser que uma variável ou constante não contenha nenhum valor. Um tipo opcional pode conter um valor ou estar ausente (um valor nulo).

Não tecnicamente, você pode pensar que é opcional como uma caixa de sapatos. A caixa de sapatos pode ou não conter um sapato. Portanto, você deve saber de antemão ao acessar o sapato da caixa.

Como declarar um opcional?

Você pode simplesmente representar um tipo de dados como opcional anexando !ou ?ao Type. Se um opcional contiver um valor, ele retornará o valor como Optional; caso contrário, ele retornará nil.

Exemplo 1: Como declarar um opcional em Swift?

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

Quando você executa o programa, a saída será:

 nada nada

No programa acima, inicializamos um tipo opcional usando ?e !. Ambas as formas são válidas para criar um opcional, mas há uma diferença importante que exploraremos a seguir.

Declarar um Int opcional significa que a variável terá um valor inteiro ou nenhum valor. Como nenhum valor é atribuído à variável, você pode ver as printsaídas de ambas as instruções nilna tela.

Exemplo 2: atribuir e acessar um valor de um opcional

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

Quando você executa o programa, a saída será:

 Opcional (5) 5 

No programa acima, declaramos um opcional do Inttipo e atribuímos o valor 5 a ele.

Como você pode ver, imprimir o opcional como print(someValue)não dá a você 5mais Optional(5). É da forma como descrito acima: Optional. Para acessar a partir dele, precisamos de um mecanismo chamado desempacotamento .

Você pode desembrulhar um !caractere opcional anexando ao final da variável / constante como na próxima linha print(someValue!). print(someValue!)desembrulha os opcionais e as saídas 5na tela.

No entanto, lembre-se de que esse tipo de mecanismo de desembrulhamento só deve ser usado quando você tiver certeza de que o opcional terá um valor ao acessá-lo.

Exemplo 3: declarando explicitamente um opcional desembrulhado

Você também pode criar um opcional desembrulhado como:

 let someValue:Int! = 5 print(someValue) 

Quando você executa o programa, a saída será:

 5

No programa acima, Int!cria um opcional desembrulhado, que desembrulha automaticamente o valor enquanto você o acessa para que você não precise anexar o !caractere todas as vezes .

Esteja certo de que, ao usar esses tipos de opcionais, a variável sempre precisará ter um valor quando você acessá-la. Caso contrário, você obterá um erro fatal de falha.

Exemplo 4: erro fatal ao acessar um opcional nulo desembrulhado

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

Ao executar o programa, você obterá um travamento como erro fatal: inesperadamente encontrado nulo ao desembrulhar um valor opcional porque o código unwrappedValue:Int = someValuetenta atribuir o valor de Optional someValue para a variável unbrappedValue.

No entanto, algum valor é um Optionaltipo que contém nilvalor. Tentar atribuir valor nulo à variável unbrappedValue que não é opcional levará ao travamento.

Existem diferentes técnicas para lidar com este caso, que são explicadas a seguir.

Manuseio Opcional

Para usar o valor de um opcional, ele precisa ser desembrulhado. A melhor maneira de usar o valor opcional é por desembrulhar condicional em vez de forçar o desembrulhar usando o !operador.

Isso ocorre porque o desempacotamento condicional pede Verificar se esta variável tem um valor? . Se sim, forneça o valor, caso contrário, ele tratará do caso nulo.

Ao contrário, forçar o desempacotamento diz que Esta variável tem um valor enquanto você a usa . Portanto, quando você força o desempacotamento de uma variável que é nulo, seu programa lançará um nulo encontrado inesperadamente ao desembrulhar uma exceção opcional e travar . Algumas das técnicas para desempacotamento condicional são explicadas abaixo:

1. Declaração de If

You can use if statement and compare optional with nil to find out whether a optional contains a value or not. You can use the comparison operator "equal to" operator (==) or the "not equal to" operator (!=) in the if statement.

Example 5: Optional handling with if else statement

 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") ) 

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 an optional contain a value, otherwise the statement inside the else block executes. The major drawback of optional handling using this technique is, you still need to unwrap the value from optional using ! operator.

2. Optional 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

No programa acima, a variável someValue é definida como opcional e contém valor nulo. O operador de coalescência nil falha em desembrulhar o opcional, portanto, retorna defaultValue. Portanto, a instrução print(unwrappedValue)gera 5 no console.

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

Quando você executa o programa, a saída será:

 10

No entanto, no programa acima, a variável opcional someValue é inicializada com o valor 10. Portanto, o operador de coalescência nil desembrulha com êxito o valor de someValue. Portanto, a instrução someValue ?? defaultValueretorna 10 e a instrução print(unwrappedValue)produz 10 no console.

Artigos interessantes...