web-dev-qa-db-fra.com

Comment imprimer une chaîne de plist sans "facultatif"?

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)
        }
    }    
16
Rob Puryear

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)
}
37
dasblinkenlight

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
5
Johnny

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.

4
Valentin Radu

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
0
Jeremy

Swift 3.1

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
0
nahung89