Em Swift, como posso escrever um caso em uma instrução switch que testa o valor sendo alternado em relação ao conteúdo de um opcional , ignorando o caso se o opcional contiver nil
?
Veja como eu imagino que isso seja:
let someValue = 5
let someOptional: Int? = nil
switch someValue {
case someOptional:
// someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
// either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}
Se eu apenas escrever exatamente assim, o compilador reclamará que someOptional
não foi desembrulhado, mas se eu desembrulhar explicitamente adicionando !
ao final, é claro que recebo um erro de tempo de execução sempre que someOptional
contém nil
. Adicionar em ?
vez de !
faria algum sentido para mim (no espírito do encadeamento opcional, eu suponho), mas não faz com que o erro do compilador desapareça (ou seja, não desembrulha o opcional).
fonte
A partir do Xcode 7 (a partir das notas de lançamento do beta 1), “um novo
x?
padrão pode ser usado para combinar padrões com opcionais como sinônimo de.Some(x)
”. Isso significa que no Xcode 7 e posterior, a seguinte variação da resposta de rintaro também funcionará:fonte
someValue?
é algum outro valor definido, mascase let val?
é apenas a versão segura e desembrulhada desomeOptional
?!let
não seja mais compilada. Não consigo me lembrar agora por que isso teria funcionado naquela época.No Swift 4, você pode usar Optional: ExpressibleByNilLiteral da Apple para empacotar opcional
https://developer.apple.com/documentation/swift/optional
Exemplo
alguns
Nenhum
padrão
Enum com valor
algum valor
fonte