2016-04-11 40 views
17

Ho trovato this question che avrebbe dovuto aiutarmi, ma la soluzione non funziona per me, e non sono sicuro se qualcosa è cambiato o se il problema è con il mio codice.WatchKit SMS con corpo preimpostato

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

Quando viene eseguito questo codice, ottengo il messaggio che facoltativi urlSafeBody era forza scartò mentre nullo, portando ad un incidente. Perché è urlSafeBody nil? So che sono costretto a scartarlo, ma non capisco perché sia ​​sempre nullo dopo essere stato assegnato esplicitamente.

+4

Questa è una domanda valida, non c'è bisogno di diminuire il voto .. – dbf

risposta

9

Non è urlSafeBody che è nullo. Come si può vedere dalla sua dichiarazione di stampa, contiene una stringa opzionale:

URLSAFEBODY: opzionale ("ciao")

che in realtà si rivelano essere un problema per la catena nel prossimo dichiarazione, dal momento che non hai scartato quella stringa prima che sia interpolata.

Se avete esaminato l'URL stringa NSURL, vedreste che conteneva:

sms: & corpo = opzionale ("ciao")

Questo sta per causare NSURL di inizializzazione fallire, poiché l'URL della stringa non è corretto. L'errore fatale succede allora perché si forza-scartò il risultato nullo da NSURL(string:)

come risolvere questo:

Si vuole scartare condizionale tutte le stringhe che potrebbero essere pari a zero. È possibile farlo tramite if let o guard let opzionale vincolante:

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

Si noti che il urlSafeBody era da scartare prima di essere utilizzato nella interpolazione stringa e url è stato anche da scartare dopo l'inizializzazione.

Poiché è certo che l'URL non è nullo, può essere passato in modo sicuro a openSystemURL.

Si dovrebbe sempre sforzarsi di evitare variabili forza-scartare che potrebbero essere nul, in quanto ciò porterà sicuramente ad un crash.