为什么这样做(例1):
if let numString:String = Model.selectedLocation?.zip{
let callString:String = String(format:"tel:%@",numString)
//more code here
}
但不是这个(例2):
if let numString:String = String(format:"tel:%@",Model.selectedLocation?.zip){
//more code here
}
在第二个示例中,Xcode抛出错误并希望zip
被解包,如:
String(format:"tel:%@",(Model.selectedLocation?.zip)!)
但如果我这样做,当zip
为零时,应用程序将崩溃。
问题: 有没有办法让上面的第二个例子工作或者不可能/正确?
答案 0 :(得分:3)
String(format:)
。这是来自NSString
框架的Foundation
方法,它有几个结果:
Foundation
。String
连接到NSString
。Swift 3
中有效,因为桥接是明确的。这里的根本问题是String(format:)
返回String?
(因为格式字符串可能无效)。您可以通过使用Swift的字符串插值来完全避免这种情况:
if let numString = Model.selectedLocation?.zip {
let callString = "tel: \(numString)"
//more code here
}
......或简单的连接:
if let numString = Model.selectedLocation?.zip {
let callString = "tel: " + numString
//more code here
}
答案 1 :(得分:1)
严格说明示例2既不是可选绑定也不是可选链接,因为String(format...)
返回非可选String
,format
参数也必须是非可选的。
示例1是处理选项的正确和推荐语法。
编辑:我完全同意Alexander的答案(String(format:)
返回String?
除外)
答案 2 :(得分:0)
<强>已更新强>
因为在String(格式:&#34;&#34;,)中,参数必须不是-nil,因此!。
当使用if-let检查选项时,语句必须返回选项
// Assuming Model.selectionLocation.zip is of String type
if let numberString = Model.selectedLocation?.zip {
let formattedString = String(format:"tel:%@", numberString)
}
或使用后卫
guard let numberString = Model.selectedLocation?.zip else {
return
}
let numberString = String(format:"tel:%@", numberString)