L'idiome pour traiter les options dans Swift semble excessivement verbeux, si tout ce que vous voulez faire est de fournir une valeur par défaut dans le cas où elle est nulle:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
qui implique une duplication inutile du code, ou
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
ce qui unwrappedValue
ne nécessite pas d'être une constante.
La monade Option de Scala (qui est fondamentalement la même idée que celle de Swift) a la méthode getOrElse
à cet effet:
val myValue = optionalValue.getOrElse(defaultValue)
Est-ce que je manque quelque chose? Swift a-t-il déjà un moyen compact de le faire? Ou, à défaut, est-il possible de définir getOrElse
dans une extension pour Optionnel?
Réponses:
Mettre à jour
Apple a maintenant ajouté un opérateur de fusion:
L'opérateur ternaire est votre ami dans ce cas
Vous pouvez également fournir votre propre extension pour l'énumération facultative:
Ensuite, vous pouvez simplement faire:
Cependant, je recommande de s'en tenir à l'opérateur ternaire car les autres développeurs le comprendront beaucoup plus rapidement sans avoir à étudier la
or
méthodeNote : J'ai commencé un module de d'ajouter des aides communes comme celui - ci
or
surOptional
la rapidité.la source
unwrappedValue
est toujours le type optionnel pour ce cas dans Swift 1.2:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). Cela a-t-il changé???
le comportement d'inférence de type par défaut est qu'il renvoie une option, ce qui n'est généralement pas ce que vous voulez. Vous pouvez déclarer la variable comme non facultative et cela fonctionne bien.Depuis août 2014, Swift a un opérateur de fusion (??) qui permet cela. Par exemple, pour une chaîne optionnelle myOptional, vous pouvez écrire:
la source
si vous avez écrit:
et
optionalValue != nil
puis leresult
seraoptional
aussi et vous devrez le déballer à l'avenirMais vous pouvez écrire un opérateur
Maintenant vous pouvez:
Et quand
optionalValue != nil
alorsresult
sera-t-ilunwraped
la source
Ce qui suit semble fonctionner
cependant, le besoin de lancer
value as T
est un horrible hack. Idéalement, il devrait y avoir un moyen d'affirmer quiT
est le même que le type contenu dans la propriété facultative. Dans l'état actuel des choses, tapez des ensembles d'inférenceT
basés sur le paramètre donné à getOrElse, puis échoue à l'exécution si cela ne correspond pas à facultatif et que facultatif n'est pas nil:la source
T
la méthode. Cela remplace en fait l'existantT
de facultatif. Vous pouvez simplement faire:func getOrElse(defaultValue: T) -> T
alors T fait référence au type de valeur réelle de l'option et vous n'avez pas à taper check itT
dans celui-ci? (au-delà de la simple supposition basée sur la convention)Optional
intérieur de Xcode, vous verrez qu'il est défini commeenum Optional<T>