2014-10-28 11 views
14

Carico un valore da un dizionario in un plist ma quando lo stampo sulla console, stampa: Opzionale (Titolo del lunedì) anziché solo "Titolo del lunedì".Come stampare una stringa da plist senza "Opzionale"?

Come è possibile eliminare l'Opzionale() del mio valore durante la stampa?

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) 
     } 
    }  
+0

Prova questa pod https://github.com/T-Pham/NoOptionalInterpolation. Lo fa esattamente. –

risposta

36

Un modo per sbarazzarsi del Optional è quello di utilizzare un punto esclamativo:

println(todayTitle!) 

Tuttavia, si dovrebbe fare solo se si è certi che il valore è lì. Un altro modo è quello di scartare e utilizzare un condizionale, come questo:

if let theTitle = todayTitle { 
    println(theTitle) 
} 

incollare questo programma nella runswiftlang per una demo:

let todayTitle : String? = "today" 
println(todayTitle) 
println(todayTitle!) 
if let theTitle = todayTitle { 
    println(theTitle) 
} 
+0

Fantastico! Grazie mille per la risposta rapida. Mi sto ancora abituando a questi optionals. –

+0

@vacawama Grazie per avermelo avvisato! Sembra che runswiftlang abbia smesso di supportare demo online, quindi ho copiato nuovamente il codice e incollato qui con le istruzioni su come provare online. Ho anche rimosso il punto interrogativo. Grazie! – dasblinkenlight

+0

Aggiunta di "!" ha funzionato per me –

4

Un altro, un po 'più compatto, modo (chiaramente discutibile, ma è a Almeno una singola nave)

(result["ip"] ?? "unavailable").description.

In teoria result["ip"] ?? "unavailable" dovrebbe avere un lavoro troppo, ma non è così, a meno che in 2.2

Naturalmente, sostituire "non disponibile" con tutto ciò che si addice: "nullo", "not found", ecc

+1

Intelligente! Come notato da @Jeremy, il tuo valore predefinito dovrebbe essere dello stesso tipo di quello opzionale. Quindi, se volessi stampare un Int: opzionale 'var i: Int ?; print ("i is: \ ((i ?? 0) .description)") // output: "i è 0" ' –

0

Non sono sicuro di quale sia il processo corretto per il collegamento ad altre risposte, ma lo stesso vale anche per my answer to a similar question.

risposta di Valentin funziona abbastanza bene per optionals di tipo String?, ma non funziona se si vuole fare qualcosa di simile:

let i? = 88 
print("The value of i is: \(i ?? "nil")") // Compiler error 
-1

inizializzare

Var text: string? = nil 

stampa

print("my string", text! as string) 

Ciò eviterà la parola "facoltativo" prima della stringa.

+0

Questo è lo stesso della [risposta accettata] (http://stackoverflow.com/a/26.600.328). – approxiblue

3

Con qualche tentativo, penso che questo sia il modo migliore.

(variableName ?? "default value")! 

Usa ?? per il valore di default e quindi utilizzare ! per variabile facoltativa unwrap.

Ecco esempio,

var a:String? = nil 
var b:String? = "Hello" 

print("varA = \((a ?? "variable A is nil.")!)") 
print("varB = \((b ?? "variable B is nil.")!)") 

Si stamperà

varA = variable A is nil. 
varB = Hello 
0

Swift 3.1

Da Swift 3, è possibile utilizzare String(describing:) per stampare valore opzionale. Ma la sintassi è abbastanza succhiata e il risultato non è facile da vedere nel log della console.

In modo da creare un'estensione di Optional per un valore costante nil.

extension Optional { 
    var logable: Any { 
     switch self { 
     case .none: 
      return "⁉️" // Change you whatever you want 
     case let .some(value): 
      return value 
     } 
    } 
} 

Come usare:

var a, b: Int? 
a = nil 
b = 1000 
print("a: ", a.logable) 
print("b: ", b.logable) 

Risultato:

a: ⁉️ 
b: 1000