2016-04-11 12 views
17

私はthis questionを見つけましたが、解決策は私にとっては効果がありません。何か変わったかどうか、問題が私のコードにあるかどうかはわかりません。WatchKitプリセットボディー付きSMS

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

このコードが実行されると、私はオプションurlSafeBodyが力となったメッセージを取得するには、クラッシュにつながる、nilにしながら、アンラップ。 urlSafeBodyはなぜですか?私はそれをアンラップしていることを知っていますが、なぜ明示的に割り当てられた後にそれが無限であるのか分かりません。

+4

これは有効な質問です。投票する必要はありません。 – dbf

答えて

9

urlSafeBodyではなく、ゼロです。

URLSAFEBODY::オプション(「こんにちは」)

実際に次のチェーンのための問題であることが判明するだろうあなたはprint文から見ることができるように、それはオプションの文字列が含まれていますあなたがその文字列を補間する前にその文字列のラップを解除していないからです。あなたはNSURL文字列のURLを検討している場合

、あなたはそれが含まれている参照してくださいね。

SMS:&体=オプション( "こんにちは")これはにNSURL初期化を引き起こすことが起こっている

文字列のURLが不正なので、失敗します。

あなたは条件付きでゼロであるかもしれない任意の文字列をアンラップしたい:致命的なエラーが、あなたはので、これを解決する方法NSURL(string:)

からnilの結果を強制的にアンラップ起こります。あなたはif letまたはオプションguard letが結合することによってこれを行うことができます:urlSafeBodyは、それが文字列の補間に使用された前のアンラップし、urlも、初期化後にラップ解除されたことを

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

注意してください。

URLはゼロではないことが確実であるため、openSystemURLに安全に渡すことができます。

強制的にアンラッピングしない変数は、必ずしもクラッシュする可能性があるため、ゼロにならないようにしてください。

関連する問題