English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste artigo, você aprenderá sobre Optionals, seus casos de uso e o tratamento de Optionals no Swift.
No artigo anterior, compreendemos os diferentes tipos de dados disponíveis no Swift e notamos que essas declarações de tipos de variáveis ou constantes contêm valores padrão.
Exemplo:
let someValue: Int() = print(someValue)
Quando o programa é executado, a saída é:
0
Mas no Swift há outro tipo chamado Optional, cujo valor padrão é nil. Se você desejar que uma variável ou constante não contenha nenhum valor, você pode usar Optional. O tipo opcional pode conter um valor ou não conter nenhum valor (nil).
Tecnicamente, você pode pensar nele como uma caixa opcional. A caixa pode conter sapatos ou não. Portanto, ao pegar os sapatos da caixa, você deve saber antes de tempo.
Você pode simplesmente representar o tipo como Optional. A maneira é adicionar ! ou ? ao tipo. Se o variável opcional contiver um valor, o valor será retornado como Optional <Value>, caso contrário, retornará nil.
var someValue: Int? var someAnotherValue: Int! = print(someValue) print(someAnotherValue)
Quando o programa é executado, a saída é:
nil nil
No programa acima, usamos ? e ! para inicializar um tipo opcional. Ambos os métodos podem criar um tipo opcional, mas há uma principal diferença, que discutiremos abaixo.
Declarar um Int opcional significa que a variável terá um valor inteiro ou não terá valor (nil). Como não foi atribuído nenhum valor à variável, você pode ver os dois prints na tela saírem nil.
let someValue: Int? = 5 print(someValue) print(someValue!)
Quando o programa é executado, a saída é:
Optional(5) 5
No programa acima, declaramos um tipo opcional Int e atribuímos um valor a ele5.
Imprimir Optional(someValue) não retornará5em vez de Optional(5) Ele tem a forma descrita acima: Optional <Value>. Para acessar <Value>, precisamos de um mecanismo chamado desempacotamento (desempacotamento)
Você pode desempacotar através do mecanismo/Adicionar o caractere ! no final de uma constante para expandir o conteúdo opcional, conforme a linha a seguir: print(someValue!). print(someValue!) desempacota o conteúdo opcional e o exibe na tela 5.
Mas lembre-se, use este mecanismo de desempacotamento apenas quando tiver certeza de que o valor opcional terá um valor ao acessá-lo.
Você também pode criar conteúdo opcional desempacotado da seguinte forma:
let someValue: Int! = 5 print(someValue)
Quando o programa é executado, a saída é:
5
No programa acima, Int! cria um conteúdo opcional não empacotado, que automaticamente desempacota o valor ao acessá-lo, portanto, você não precisa usar o caractere ! a cada vez.
Certifique-se de que, ao usar essas opções opcionais, a variável sempre tenha um valor ao ser acessada. Se não fizer isso, ocorrerá um erro fatal de falha.
var someValue: Int! var unwrappedValue: Int = someValue //crashes due to this line
Quando você executar o programa, você receberá um erro fatal de falha: ao desempacotar o valor opcional, foi encontrado um nil inesperado, porque o código unwrappedValue: Int = someValue tentou atribuir o valor do Optional someValue à variável unwrappedValue.
Mas, somevalue é um tipo opcional que contém um valor nil. Tentar atribuir um valor nil a uma variável unwrappedValue (que não é um Optional) causará falha.
A seguir, serão explicadas as diferentes maneiras de lidar com essa situação.
Para usar valores opcionais, é necessário desempacotá-los. Uma maneira melhor de usar valores opcionais é através do desempacotamento condicional, em vez de usar o operador ! para desempacotamento forçado.
Isso é porque o desempacotamento condicional perguntaVocê está verificando se essa variável tem um valor?。Se sim, forneça o valor; caso contrário, trate o caso nil.
Por outro lado, a desempacotamento forçado indica que a variável realmente tem um valor ao ser usada. Portanto, quando você força o desempacotamento de uma variável nil, seu programa lançará uma exceção opcional e falhará ao encontrar nil inesperado. Abaixo estão algumas técnicas úteis para a desempacotamento condicional:
Você pode usar a instrução if para comparar o parâmetro opcional com nil para descobrir se o parâmetro opcional contém um valor. Você pode usar o operador de comparação "igual a" (==) ou o operador de comparação "diferente de" (!=) na instrução if.
var someValue: Int? var someAnotherValue: Int! = 0 if someValue != nil { print("Contém valor \(someValue!)") } else { print("Não contém valor") } if someAnotherValue != nil { print("Contém valor \(someAnotherValue!)") } else { print("Não contém valor") }
Quando o programa é executado, a saída é:
Não contém valor Contém valor 0
No programa acima, se a expressão opcional contiver um valor, o código dentro da instrução if será executado; caso contrário, a instrução dentro do bloco else será executada. A principal desvantagem de usar este método para o tratamento de opcional é que você ainda precisa usar o operador ! para desempacotar o valor do opcional.
O vínculo opcional pode ajudar a descobrir se o valor opcional contém um valor. Se o valor opcional contiver um valor, ele pode ser usado como uma constante ou variável temporária. Portanto, o vínculo opcional pode ser usado junto com a instrução if para verificar o valor dentro do opcional e extrair-o como uma constante ou variável em uma única operação.
var someValue: Int? var someAnotherValue: Int! = 0 if let temp = someValue { print("Contém valor \(temp)") } else { print("Não contém valor") } if let temp = someAnotherValue { print("Contém valor \(temp)") } else { print("Não contém valor") }
Quando o programa é executado, a saída é:
Não contém valor Contém valor 0
No programa acima, se a expressão opcional contiver um valor, execute o código dentro da instrução if. Caso contrário, o bloco else será executado. if-A declaração let também desempacota automaticamente o valor e armazena o valor desempacotado na constante temp. A principal vantagem desse método é que, mesmo que você possa determinar que um conteúdo opcional contém um valor, você não precisa forçar a desempacotamento.
Você também pode usar a declaração guard em Swift para lidar com conteúdo opcional. Se você não sabe o que é guard, não se preocupe. Agora, apenas veja o guard como um if-Não há condição de bloqueio para else se a condição falhar. Se não, execute a próxima instrução. Para mais detalhes, consulteSwift Guard.
func testFunction() { let someValue: Int? = 5 guard let temp = someValue else { return } print("Tem algum valor \(temp)") } testFunction()
Quando o programa é executado, a saída é:
Tem algum valor 5
No programa acima, o guard contém uma condição, ou seja, a opção someValue contém um valor. Se ela contiver um valor, então o guard-A declaração let desempacota automaticamente o valor e coloca o valor desempacotado na constante temp. Caso contrário, o bloco else será executado e ele retornará para a função de chamada. Porque a opção contém um valor, a função print é chamada. Mais detalhes, veja Swift guard.
No Swift, você também pode usar o operador de coalescência opcional para verificar se uma opção contém um valor. Ele é definido como (a??b). Ele expande a opção a, se ela contiver um valor, retornando-o, ou se a for nula, retornando o valor padrão b.
var someValue: Int! let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
Quando o programa é executado, a saída é:
5
No programa acima, a variável someValue é definida como opcional e contém o valor nil. O operador de unpacking de valor com espaço vazio não pode desempacotar o valor opcional, portanto retorna defaultValue. Portanto, a sentença print(unwrappedValue) imprime no console5.
var someValue: Int? = 10 let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
Quando o programa é executado, a saída é:
10
Mas, no programa acima, a variável opcional someValue foi inicializada com o valor10. Portanto, o operador de unpacking de valor com espaço vazio com sucesso extraiu o valor someValue. Portanto, a sentença someValue ?? defaultValue retorna no console10A sentença print(unwrappedValue) imprime10.