El modismo para tratar con las opciones en Swift parece excesivamente detallado, si todo lo que desea hacer es proporcionar un valor predeterminado en el caso en que sea nulo:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
que implica duplicar código innecesariamente, o
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
lo cual requiere unwrappedValue
no ser una constante.
La mónada Option de Scala (que es básicamente la misma idea que la Opcional de Swift) tiene el método getOrElse
para este propósito:
val myValue = optionalValue.getOrElse(defaultValue)
¿Me estoy perdiendo de algo? ¿Swift ya tiene una forma compacta de hacerlo? O, en su defecto, ¿es posible definir getOrElse
en una extensión para Opcional?
Respuestas:
Actualizar
Apple ahora ha agregado un operador de fusión:
El operador ternario es tu amigo en este caso
También puede proporcionar su propia extensión para la enumeración opcional:
Entonces solo puedes hacer:
Sin embargo, recomiendo apegarse al operador ternario ya que otros desarrolladores lo entenderán mucho más rápidamente sin tener que investigar el
or
método.Nota : Empecé un módulo de añadir ayudantes comunes como éste
or
enOptional
al veloz.fuente
unwrappedValue
sigue siendo el tipo opcional para este caso en Swift 1.2:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). ¿Ha cambiado esto???
comportamiento de inferencia de tipo predeterminado es que devuelve un opcional, que normalmente no es lo que desea. Puede declarar la variable como no opcional y esto funciona bien.A partir de agosto de 2014, Swift tiene un operador coalescente (??) que lo permite. Por ejemplo, para un String myOptional opcional, podría escribir:
fuente
si escribiste:
y
optionalValue != nil
luegoresult
lo seráoptional
también y necesitarás desenvolverlo en el futuroPero puedes escribir operador
Ahora usted puede:
Y cuando
optionalValue != nil
entoncesresult
seráunwraped
fuente
Lo siguiente parece funcionar
Sin embargo, la necesidad de lanzar
value as T
es un truco feo. Idealmente, debería haber una manera de afirmar queT
es el mismo que el tipo contenido en el Opcional. Tal como está, escriba conjuntos de inferenciaT
basados en el parámetro dado a getOrElse, y luego falla en el tiempo de ejecución si esto no coincide con el Opcional y el Opcional no es nulo:fuente
T
el método. Eso realmente anula lo existenteT
de Opcional. Usted sólo puede hacer:func getOrElse(defaultValue: T) -> T
entonces T se refiere al tipo de valor real de la opcional y usted no tiene que escribir comprobarloT
? (más allá de simplemente asumir según la convención)Optional
dentro de Xcode, verá que se define comoenum Optional<T>