Je charge une valeur d'un dictionnaire dans un plist, mais lorsque je l'imprime sur la console, il affiche: Facultatif (titre lundi) plutôt que simplement "titre lundi".
Comment puis-je me débarrasser de la valeur Optional () de ma valeur lors de l'impression?
var plistPath = NSBundle.mainBundle().pathForResource("days", ofType: "plist")
var plistArray = NSArray(contentsOfFile: plistPath!) as NSArray!
for obj: AnyObject in plistArray {
if var dicInfo = obj as? NSDictionary {
let todayTitle: AnyObject? = dicInfo.valueForKey("Title")
println(todayTitle)
}
}
Une façon de se débarrasser de la Optional
consiste à utiliser un point d'exclamation:
println(todayTitle!)
Cependant, vous ne devriez le faire que si vous êtes certain que la valeur est là. Une autre méthode consiste à décompresser et à utiliser un conditionnel, comme ceci:
if let theTitle = todayTitle {
println(theTitle)
}
Collez ce programme dans runswiftlang pour une démonstration:
let todayTitle : String? = "today"
println(todayTitle)
println(todayTitle!)
if let theTitle = todayTitle {
println(theTitle)
}
Avec quelques essais, je pense que cette façon est meilleure.
(variableName ?? "default value")!
Utilisez ??
pour la valeur par défaut, puis !
pour dérouler la variable facultative.
Voici un exemple
var a:String? = nil
var b:String? = "Hello"
print("varA = \( (a ?? "variable A is nil.")! )")
print("varB = \( (b ?? "variable B is nil.")! )")
Il va imprimer
varA = variable A is nil.
varB = Hello
Une autre manière, légèrement plus compacte (clairement discutable, mais au moins une doublure)
(result["ip"] ?? "unavailable").description
.
En théorie, result["ip"] ?? "unavailable"
devrait aussi fonctionner, mais ce n'est pas le cas, sauf en 2.2
Bien sûr, remplacez "indisponible" par ce que vous convient: "nil", "introuvable", etc.
Je ne suis pas sûr du processus à suivre pour faire le lien avec d'autres réponses, mais ma réponse à une question similaire s'applique également ici.
La réponse de Valentin fonctionne assez bien pour les options du type String?
, mais ne fonctionnera pas si vous voulez faire quelque chose comme:
let i? = 88
print("The value of i is: \(i ?? "nil")") // Compiler error
A partir de Swift 3, vous pouvez utiliser String(describing:)
pour imprimer une valeur optionnelle. Mais la syntaxe est assez mauvaise et le résultat n'est pas facile à voir dans le journal de la console.
Donc, je crée une extension de Optional
pour créer une valeur nil
cohérente.
extension Optional {
var logable: Any {
switch self {
case .none:
return "⁉️" // Change you whatever you want
case let .some(value):
return value
}
}
}
Comment utiliser:
var a, b: Int?
a = nil
b = 1000
print("a: ", a.logable)
print("b: ", b.logable)
Résultat:
a: ⁉️
b: 1000