Swift 101 - Trabalhando com os novos valores opcionais da Swift

A linguagem de programação Swift possui um novo recurso chamado opcionais que não estavam disponíveis anteriormente no Objective-C. Eles são semelhantes aos tipos opcionais em tipos Java e anuláveis na linguagem de programação C #.

Por que usar opcionais?

Você pode estar pensando "Eu posso ignorar os opcionais - é um recurso que eu nunca usarei", mas eu recomendo que você leia mais. Você descobrirá que deve usar opcionais no Swift se precisar de um valor para ser nulo!

Os valores opcionais no Swift permitem que você seja mais preciso em seu código, permitindo que você especifique quando um valor específico está vazio (e quando não está!) Isso ajuda a evitar erros de programação comuns que ocorrem no seu aplicativo quando ele encontra um valor nulo inesperado.

Os opcionais do Swift também ajudam o código do seu aplicativo a refletir melhor a capacidade que você já tem no Core Data para indicar que um determinado atributo de entidade é opcional. Conforme mostrado na Figura 1, você pode especificar o tipo de um atributo (String, neste caso), bem como indicar se o valor é opcional.

Figura 1 - Você pode especificar que um atributo de entidade Core Data é opcional.

Agora o Swift permite que você faça o mesmo com suas propriedades e variáveis. Aqui está uma declaração opcional equivalente no Swift:

var middleName: String?

Essa declaração cria uma variável chamada middleName do tipo String . O ponto de interrogação ( ? ) Após o tipo de variável String indica que a variável middleName pode conter um valor que pode ser String ou nil . Qualquer um que veja este código imediatamente sabe que o middleName pode ser nulo . É auto-documentado!

Se você não especificar um valor inicial para uma constante ou variável opcional (como mostrado acima), o valor será automaticamente definido como zero para você. Se preferir, você pode definir explicitamente o valor inicial como nil:

var middleName: String? = nil

Agora vamos dar uma olhada em como o nil é usado no Swift.

nil em Swift

Pode não ser óbvio à primeira vista, mas apenas os opcionais podem ser nulos . Como afirmado no livro da Apple, o Swift Programming Language (disponível gratuitamente na iBooks Store):

nil não pode ser usado com constantes e variáveis ​​não opcionais. Se uma constante ou variável em seu código precisar ser capaz de lidar com a ausência de um valor sob certas condições, sempre a declare como um valor opcional do tipo apropriado.

Isso significa que você não pode fazer algo assim, porque a variável firstName não está marcada com um ponto de interrogação para indicar que é um opcional:

var firstName: String = nil

Este código produz o seguinte erro de tempo de compilação:

O tipo 'String' não está em conformidade com o protocolo 'NilLiteralConvertible' .

Também é importante notar que nada no Swift é diferente de zero em Objective-C. Em Objective-C, nil é um ponteiro para um objeto inexistente. Em Swift, nada indica simplesmente a ausência de um valor - não é um ponteiro. Isso significa que você pode especificar opcionais de qualquer tipo, não apenas tipos de objetos.

Acessando Valores Opcionais

Ao contrário de outras linguagens de programação, no Swift, você não pode acessar um valor opcional diretamente . Você deve desembrulhar o opcional primeiro para acessar seu valor subjacente. Tomemos por exemplo o seguinte código:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

As três primeiras linhas de código declaram uma variável String firstName, uma variável String opcional middleName e uma variável String FirstAndMiddleNames . A próxima linha de código concatena (une) os valores da variável firstName e middleName, juntamente com um espaço entre eles. Você pode se surpreender ao descobrir que essa linha de código gera o seguinte erro de tempo de compilação:

Valor do tipo de opção 'String'? não desembrulhado; você quis usar '!' ou '?'

Este é um dos mecanismos de proteção do Swift. Isso força você a reconhecer que um valor pode ser nulo . Então, como você desdobra um opcional? Existem duas maneiras principais, conforme descrito nas seções a seguir.

Usando o Desempacotamento Forçado para Opcionais

Como sugerido pelo erro do compilador na seção anterior, uma maneira de desembrulhar um valor opcional é usar o ponto de exclamação (!) Após o opcional para explicitamente desembrulhá-lo. Por exemplo:

firstAndMiddleNames = firstName + " " + middleName!

Isso força manualmente o valor do middleName opcional a ser desembrulhado. No entanto, se middleName contiver um valor nulo no tempo de execução, isso produzirá um erro de tempo de execução EXC_BAD_INSTRUCTION . Então, obviamente, você não gostaria de usar o desempacotamento forçado, a menos que tenha absoluta certeza de que o valor não é nulo .

Usando a ligação opcional para separar opções

Você pode usar uma técnica conhecida como ligação opcional para testar se um opcional contém um valor e, em caso afirmativo, armazenar esse valor em uma variável ou constante temporária. Para mostrar como isso funciona com nosso exemplo anterior, confira este código:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

se deixar meio = middleName

{

firstAndMiddleNames = firstName + "" + middle

}

outro

{

firstAndMiddleNames = firstName

}

Quando a condição if é verificada em tempo de execução, se a variável middleName contiver um valor String, a condição será avaliada como true, o valor contido na variável middleName será desembrulhado, armazenado na constante do meio e o código entre chaves da instrução if É executado.

Se a variável middleName contiver nil, a condição será avaliada como false, o valor opcional não será desembrulhado e o código nas chaves da instrução else será executado.

Opcionais implicitamente não-embalados

O Swift também tem algo chamado opcionalmente desembrulhado. Estes são opcionais que não precisam ser desembrulhados usando o desempacotamento forçado (!) Ou a encadernação opcional porque eles são desembrulhados implicitamente (automaticamente). Eles são declarados usando um ponto de exclamação (!) Em vez de um ponto de interrogação (?).

Você frequentemente vê opcionais implicitamente não desembrulhados ao trabalhar com tomadas do Interface Builder (propriedades IBOutlet ). Por exemplo:

@IBOutlet weak var lblDescription: UILabel!

Nesse código, a propriedade de saída lblDescription possui um ponto de exclamação após ela, indicando que ela está implicitamente não-preenchida. Isso permite que você acesse a propriedade sem desdobrá-la.

Neste exemplo, a propriedade de saída não é garantida para conter uma referência a um rótulo, mas deve absolutamente. Se não contiver uma referência a uma etiqueta, significa que a conexão entre a tomada e a etiqueta foi quebrada. Nesse caso, não há problema em ter um erro de tempo de execução porque você deseja saber se a conexão está quebrada para poder corrigi-la.

Obviamente, nos casos em que você não tem 100% de certeza de que uma constante ou variável contém um valor, você deve usar um opcional regular em seu lugar.

Conclusão

Opcionais são um ótimo novo recurso do Swift que permite manipular com segurança valores nulos em seus aplicativos iOS. Eu recomendo rever este post algumas vezes para ter certeza de que você entende os conceitos básicos, e então volte ao livro da Apple, o Swift Programming Language, para aprender mais sobre como os opcionais são usados ​​no Swift.