2014-10-28 17 views
14

Załaduję wartość ze słownika w pliku plist, ale po wydrukowaniu go na konsoli, wypisuje on: Opcjonalnie (tytuł Poniedziałek), a nie tylko "Tytuł Poniedziałek".Jak wydrukować ciąg z plist bez "Opcjonalnie"?

Jak pozbyć się opcjonalnej() z mojej wartości podczas drukowania?

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

Spróbuj kapsułę https://github.com/T-Pham/NoOptionalInterpolation. Dokładnie to robi. –

Odpowiedz

36

Jednym ze sposobów, aby pozbyć się Optional jest użycie wykrzyknika:

println(todayTitle!) 

Jednakże, należy to zrobić tylko wtedy, gdy masz pewność, że wartość ma. Innym sposobem jest do otwierania i korzystania warunkowe, tak:

if let theTitle = todayTitle { 
    println(theTitle) 
} 

Wklej ten program w runswiftlang dla Demo:

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

Awesome! Dziękuję bardzo za szybką odpowiedź. Wciąż się przyzwyczaiłem do tych opcji. –

+0

@vacawama Dzięki za powiadomienie mnie o tym! Wygląda na to, że runwiftlang przestał wspierać dema online, więc skopiowałem ponownie wpisany kod i wkleiłem go tutaj z instrukcjami, jak spróbować int online. Usunąłem również znak zapytania. Dziękuję Ci! – dasblinkenlight

+0

Dodawanie "!" pracował dla mnie. –

4

Innym, nieco bardziej kompaktowy sposób (oczywiście dyskusyjna, ale to co najmniej jedna wyściółka)

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

Teoretycznie result["ip"] ?? "unavailable" powinien mieć pracę też, ale tak nie jest, chyba że w 2,2

Oczywiście zastąpić „niedostępny” z tym, co ci odpowiada: „Nil”, „nie znaleziono” itp

+1

Sprytny! Jak zauważyliśmy przez @Jeremy, twoja domyślna wartość powinna być tego samego typu, co opcja. Tak więc, jeśli chcesz wydrukować opcjonalnie Int: 'var i: Int ?; print ("i is: \ ((i ?? 0) .description)") // output: "i is 0" ' –

0

Nie jestem pewien, jaki jest prawidłowy proces łączenia z innymi odpowiedziami, ale tutaj również ma zastosowanie my answer to a similar question.

odpowiedź Valentin działa wystarczająco dobrze dla optionals typu String?, ale nie będzie działać, jeśli chcesz zrobić coś takiego:

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

zainicjować

Var text: string? = nil 

Drukowanie

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

Pozwoli to uniknąć słowa "opcjonalne" przed ciągiem.

+0

To jest to samo, co [zaakceptowana odpowiedź] (http://stackoverflow.com/a/26600328). – approxiblue

3

Z pewną próbą, myślę, że ten sposób jest lepszy.

(variableName ?? "default value")! 

Zastosowanie ?? do wartości domyślnej, a następnie użyć ! na rozpakowanie zmiennej fakultatywnej.

Oto przykład,

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

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

To będzie drukować

varA = variable A is nil. 
varB = Hello 
0

Swift 3.1

Od Swift 3, można użyć String(describing:) wydrukować wartość opcjonalna. Ale składnia jest dość zasysana, a wynik nie jest łatwy do odczytania w logu konsoli.

Aby utworzyć rozszerzenie Optional, aby uzyskać spójną wartość nil.

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

Jak używać:

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

Wynik:

a: ⁉️ 
b: 1000