2016-04-11 5 views
17

Ich fand this question, die mir geholfen haben sollte, aber die Lösung dort funktioniert nicht für mich, und ich bin mir nicht sicher, ob sich etwas geändert hat oder wenn das Problem mit meinem Code ist.WatchKit SMS mit voreingestellten Körper

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
print("URLSAFEBODY: \(urlSafeBody)") 
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!) 

Wenn dieser Code ausgeführt wird, erhalte ich die Meldung, dass urlSafeBody war Kraft, während Null ausgepackt optional, zu einem Absturz führt. Warum ist urlSafeBody Null? Ich weiß, dass ich gezwungen bin, es auszupacken, aber ich verstehe nicht, warum es immer null ist, nachdem es explizit zugewiesen wurde.

+4

Dies ist eine gültige Frage, kein Grund zur Abstimmung. – dbf

Antwort

9

Es ist nicht urlSafeBody das ist Null. Wie Sie aus Ihrer Print-Anweisung sehen können, enthält es eine optionale Zeichenkette:

URLSAFEBODY: Optional („Hallo“)

, die tatsächlich ausfallen wird ein Problem für die Kette in der nächsten sein Anweisung, da Sie diese Zeichenfolge nicht ausgepackt haben, bevor sie interpoliert wird.

Wenn Sie Ihre NSURL Zeichenfolge URL untersucht, dann würden Sie sehen, es enthielt:

sms: & body = Optional ("Hallo")

Diese NSURL Initialisierung verursachen wird zu scheitern, weil die String-URL falsch formatiert ist. Der fatale Fehler tritt dann, weil Sie das Null resultieren aus NSURL(string:)

Wie lösen dieses zwangsausgepackt:

Sie wollen bedingt, um alle Saiten auszupacken, die Null sein könnte. Sie können dies über if let oder guard let optional Bindung:

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=\(urlSafeBody)") { 
    WKExtension.sharedExtension().openSystemURL(url) 
} 

Beachten Sie, dass die urlSafeBody ausgepackt wurde, bevor es in der String-Interpolation verwendet wurde, und url wurde auch nach der Initialisierung ausgepackt.

Da sicher ist, dass die URL nicht null ist, kann sie sicher an openSystemURL übergeben werden.

Sie sollten immer danach streben, Variablen zu erzwingen, die keine Variablen auspacken, die möglicherweise Null sind, da dies sicherlich zu einem Absturz führen wird.

Verwandte Themen