English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipos de Dados Opcionais Swift (Optional)

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.

Como declarar um opcional?

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.

Exemplo1: Como declarar um opcional em Swift?

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.

Exemplo2: Atribuir e acessar valores de um objeto opcional

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.

Exemplo3: Declarar explicitamente um conteúdo opcional não empacotado

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.

Exemplo4:Ocorre um erro fatal ao acessar um objeto opcional não empacotado

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.

Tratamento opcional

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:

1.Instrução if

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.

Exemplo5:Tratamento opcional de instrução if else

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.

2.Vínculo opcional (if let)

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.

Exemplo5:使用if let语句的可选处理

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.

3.Declaração guard

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.

Exemplo6:使用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.

4.Operador de coalescência opcional (??)

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.

Exemplo7:使用空合运算符的可选处理

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.