O idioma para lidar com opcionais no Swift parece excessivamente detalhado, se tudo o que você deseja fazer é fornecer um valor padrão no caso em que é nulo:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
que envolve a duplicação desnecessária de código ou
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
o que unwrappedValue
não requer ser uma constante.
A mônada de Scala's Option (que é basicamente a mesma ideia que a Swift's Optional) possui o método getOrElse
para esse fim:
val myValue = optionalValue.getOrElse(defaultValue)
Estou esquecendo de algo? O Swift já tem uma maneira compacta de fazer isso? Ou, na sua falta, é possível definir getOrElse
em uma extensão para Opcional?
Respostas:
Atualizar
A Apple agora adicionou um operador coalescente:
O operador ternário é seu amigo neste caso
Você também pode fornecer sua própria extensão para a enumeração opcional:
Então você pode simplesmente fazer:
No entanto, eu recomendo aderir ao operador ternário, pois outros desenvolvedores entenderão isso muito mais rapidamente sem precisar investigar o
or
métodoNota : Eu comecei um módulo para adicionar auxiliares comuns como esta
or
emOptional
que rápida.fonte
unwrappedValue
ainda é o tipo opcional para este caso no Swift 1.2:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). Isso mudou???
o comportamento de inferência de tipo padrão é que ele retorna um opcional, que não é o que você deseja normalmente. Você pode declarar a variável como não opcional e isso funciona bem.Em agosto de 2014, a Swift tinha um operador coalescente (??) que permite isso. Por exemplo, para uma String opcional myOptional, você pode escrever:
fonte
se você escreveu:
e
optionalValue != nil
entãoresult
seráoptional
também e você precisará desembrulhá-lo no futuroMas você pode escrever operador
Agora você pode:
E quando
optionalValue != nil
entãoresult
seráunwraped
fonte
O seguinte parece funcionar
no entanto, a necessidade de lançar
value as T
é um truque feio. Idealmente, deve haver uma maneira de afirmar queT
é igual ao tipo contido no Opcional. Como está, digite conjuntos de inferências comT
base no parâmetro fornecido para getOrElse e falhe no tempo de execução se isso não corresponder ao Opcional e o Opcional for nulo:fonte
T
o método. Na verdade, isso substitui o existenteT
do Opcional. Você pode apenas fazer:func getOrElse(defaultValue: T) -> T
então T refere-se ao tipo de valor real do opcional e você não tem que digitar verificá-loT
nesse? (além de simplesmente assumir com base na convenção)Optional
interior Xcode, você vai ver que ele é definido comoenum Optional<T>