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 unwrappedValueno 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 getOrElsepara 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 getOrElseen 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
ormétodo.Nota : Empecé un módulo de añadir ayudantes comunes como éste
orenOptionalal veloz.fuente
unwrappedValuesigue 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 != nilluegoresultlo seráoptionaltambién y necesitarás desenvolverlo en el futuroPero puedes escribir operador
Ahora usted puede:
Y cuando
optionalValue != nilentoncesresultseráunwrapedfuente
Lo siguiente parece funcionar
Sin embargo, la necesidad de lanzar
value as Tes un truco feo. Idealmente, debería haber una manera de afirmar queTes el mismo que el tipo contenido en el Opcional. Tal como está, escriba conjuntos de inferenciaTbasados 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
Tel método. Eso realmente anula lo existenteTde Opcional. Usted sólo puede hacer:func getOrElse(defaultValue: T) -> Tentonces 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)Optionaldentro de Xcode, verá que se define comoenum Optional<T>