An Interest In:
Web News this Week
- March 22, 2024
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
Optional em Swift
Capa por Ana Municio no Unsplash
Sumrio
- Introduo
- Lidando com Optional
- Force unwrapping
- Binding opcional
- Unwrapping implcito
- Encadeamento opcional
Introduo
possvel criar variveis em Swift que no necessariamente tenham um valor definido(ou seja, nulo) e elas so conhecidas como opcionais. Para que uma varivel no tenha valor usamos o valor nil
. Definimos uma varivel como opcional colocando uma interrogao aps a definio do seu tipo, da seguinte forma:
var minhaString: String? = nilprint(minhaString)// Sada: nil
A partir dessa atribuio, a varivel minhaString
ainda no tem valor definido. Agora, podemos tentar atribuir um valor minhaString
e verificar o resultado:
var minhaString: String? = "Ol mundo!"print(minhaString)// Sada: Optional("Ol mundo!")
Lidando com Optional
Lidar com variveis opcionais requer um pouco mais de ateno, pois importante verificar se essa varivel possui valor antes de utiliz-lo em algum trecho de cdigo. Para isso, temos 4 opes:
- Usando o force unwrapping, com
!
- Usando binding opcional, com
if let
- Usando o unwrapping implcito de opcionais, com
!
- Usando encadeamento opcional, com
a?.b?.c
- Usando unwrapping incondicional
Force unwrapping
Force unwrapping, que pode ser traduzido como "forar a desembrulhar" a forma explicita de extrair o valor de um Optional
. Ele pode ser usado, por exemplo, em um parmetro de uma funo que no pode ser nil
, dessa forma:
// O parmetro 'nome' no opcionalfunc minhaFuncao(nome: String) { print("Ol, \(nome)")}// A varivel 'meuNome' opcional e tem valor 'nil'var meuNome: String? = nilminhaFuncao(nome: meuNome!)
O trecho abaixo dispararia a seguinte exceo:
Unexpectedly found nil while unwrapping an Optional value
Por qu? Pelo fato de que o valor da varivel meuNome
foi atribudo como nil
. Portanto, importante ter em mente que, para usar o force unwrapping, necessrio atender pelo menos um dos seguintes critrios:
- Ter certeza de que o valor est definido
- Tratar a exceo que ser lanada caso o valor seja
nil
Se o valor da varivel meuNome
no fosse nil
, o resultado seria diferente:
func minhaFuncao(nome: String) { print("Ol, \(nome)")}var meuNome: String? = "ReisDev"minhaFuncao(nome: meuNome!)// Sada: "Ol, ReisDev"
O uso do force unwrapping no recomendado por conta dos erros que ele pode ocasionar caso alguma varivel tenha o valor nil
. Por isso, use com cautela.
Binding opcional
if let
Optional binding, que pode ser traduzido como "amarrao opcional", consiste em garantir que um trecho de cdigo ser executado apenas se um determinado valor no for nil
. Inclusive, possvel verificar sub-condies, como atributos de objetos. Abaixo, um exemplo de uso:
var meuTexto: String? = nilif let texto = meuTexto { /* * Nesse contexto, a varivel texto * do tipo String, e no 'String?' */}
No bloco de cdigo acima, o trecho contido entre as chaves chamado de closure
, e voc pode ver mais detalhes neste link(em ingls). Dentro dessa closure a varivel texto
(que recebeu o valor da varivel meuTexto
) do tipo String
por conta da amarrao opcional. Se o valor da varivel meuTexto
no for nil
, ele ser "amarrado" varivel texto
, e o trecho de cdigo dentro da closure ser executado.
guard let
Alm do if let
, podemos usar tambm o guard let
, que valida se uma varivel tem valor e, caso no tenha, executa um trecho de cdigo que deve encerrar a execuo, seja do programa ou de uma funo. Abaixo, um exemplo:
func validaTexto(meuTexto: String?) -> Bool { guard let texto = meuTexto else { return false } // Valida o texto ...}
Unwrapping implcito
O unwrapping implcito, que pode ser traduzido como "desembrulhamento" implcito, usado para evitar ter que usar as outras abordagens citadas nesse artigo para obter o valor de uma varivel Optional
. Ele funciona da seguinte forma:
var pessoa: Pessoa! = nil
Como a varivel pessoa
do tipo Pessoa?
(sem o unwrapping implcito), se tentarmos acessar o atributo endereco
, por exemplo, obteramos o seguinte erro:
value of optional type 'Pessoa?' must be unwrapped to refer to member 'endereco' of wrapped base type 'Pessoa'
Por qu? O compilador da linguagem sabe que arriscado acessar uma varivel Optional
sem a garantia de que ela de fato tem um valor, pois isso pode causar um erro. Por isso, ele tenta garantir que quem est escrevendo o cdigo faa essa verificao.
O unwrapping implcito usado exatamente para no precisar fazer essa verificao todas as vezes. Parece prtico, mas tambm pode ser arriscado. Se voc utilizar esse recurso, tenha o cuidado de tratar excees, pois pode acontecer de sua varivel ter o valor nil
, e isso ir ocasionar em um erro. O uso desse recurso no encorajado, por conta dos problemas que ele pode gerar. Por isso, Use com moderao.
Encadeamento opcional
Optional chaining, que pode ser traduzido como "encadeamento opcional", usado, por exemplo, quando se tem atributos de objetos que podem ser nulos, e esses objetos tambm tem atributos que podem ser nulos. Abaixo, um exemplo:
var minhaRua = pessoa?.endereco?.rua
O objeto pessoa do tipo Pessoa?
, e o objeto pessoa possui um atributo endereco
do tipo Endereco?
. A varivel minhaRua
tambm ser do tipo Optional
, e ela receber um valor somente se o objeto pessoa
e seu aributo endereco
no forem nil
. Caso algum deles tenha valor nulo, a varivel minhaRua
tambm ter valor nil
.
Unwrapping incondicional
Unconditional unwrapping, que pode ser traduzido como "desembrulhamento incondicional", usado quando voc tem certeza de que um Optional
contm um valor. Abaixo, um exemplo:
var numero = Int("42")!print(number)// Sada: 42
No trecho acima, o inicializador de Int
pode falhar, pois a string fornecida pode no conter um nmero. Porm, ns temos certeza de que "42"
ir resultar em um nmero. Logo, podemos usar o unconditional unwrapping.
Concluso
Agora voc j sabe como funcionam as variveis do tipo Optional
e as diferentes maneiras como voc pode lidar com elas. Lembre-se sempre de avaliar a forma mais adequada de tratar variveis opcionais em cada situao. Caso queira saber mais detalhes, recomendo que leia a documentao da Apple.
Gostou deste artigo? Compartilhe e me siga para mais contedos como esse!
Minhas redes:
Twitter | Instagram | Blog | Youtube | GitHub | LinkedIn
At a prxima!
Original Link: https://dev.to/reisdev/optionals-em-swift-4lh0
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To