Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 26, 2022 09:17 pm GMT

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

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To