Cha*_*lie 17 sms nsurl optional swift watchkit
我发现这个问题应该对我有所帮助,但是那里的解决方案对我不起作用,而且我不确定某些事情是否发生了变化,或者问题是否与我的代码有关.
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: \(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!)
Run Code Online (Sandbox Code Playgroud)
执行此代码时,我收到的消息是,urlSafeBody
在nil时强制解包可选,导致崩溃.为什么是urlSafeBody
零?我知道我强行打开它,但我不明白为什么在明确指定之后它永远是零.
小智 9
这不是urlSafeBody
零.从print语句中可以看出,它包含一个可选字符串:
URLSAFEBODY:可选("你好")
在下一个语句中,这实际上会成为链的一个问题,因为在插入之前你还没有解开该字符串.
如果您检查了NSURL
字符串URL,则会看到它包含:
SMS:&体=可选( "你好")
这将导致NSURL
初始化失败,因为它的字符串URL格式不正确.然后发生致命错误,因为你强行解开了零结果NSURL(string:)
如何解决这个问题:
你想有条件地打开任何可能是零的字符串.您可以通过if let
或guard let
可选绑定来执行此操作:
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=\(urlSafeBody)") {
WKExtension.sharedExtension().openSystemURL(url)
}
Run Code Online (Sandbox Code Playgroud)
请注意,urlSafeBody
在字符串插值中使用之前,它已被解包,并且url
在初始化之后也被解包.
由于确定网址不是零,因此可以安全地传递给网址openSystemURL
.
你应该总是努力避免强制展开可能为零的变量,因为这肯定会导致崩溃.
归档时间: |
|
查看次数: |
319 次 |
最近记录: |