Swift 一步可选链接?
为什么这样做(示例1): 但不是这个(示例2): 在第二个示例中,Xcode抛出一个错误,并希望Swift 一步可选链接?,swift,xcode,optional,Swift,Xcode,Optional,为什么这样做(示例1): 但不是这个(示例2): 在第二个示例中,Xcode抛出一个错误,并希望zip像这样展开: 字符串(格式:“tel:%@”,(Model.selectedLocation?.zip)!) 但如果我这样做,当zip为零时,应用程序将崩溃 问题: 有没有办法使上面的第二个示例起作用或者不可能/正确?严格来说,示例2既不是可选的绑定,也不是可选的链接,因为String(format…返回一个非可选的String,并且format参数也必须是非可选的 示例1是处理选项的正确且推荐
zip
像这样展开:
字符串(格式:“tel:%@”,(Model.selectedLocation?.zip)!)
但如果我这样做,当
zip
为零时,应用程序将崩溃
问题:
有没有办法使上面的第二个示例起作用或者不可能/正确?严格来说,示例2既不是可选的绑定,也不是可选的链接,因为
String(format…
返回一个非可选的String
,并且format
参数也必须是非可选的
示例1是处理选项的正确且推荐的语法
编辑:我完全同意Alexander的回答(除了
String(format:)
返回String?
)严格来说,示例2既不是可选的绑定,也不是可选的链接,因为String(format…
返回非可选的String
,而且format
参数必须是非可选的,也是
示例1是处理选项的正确且推荐的语法
编辑:我完全同意Alexander的回答(除了
String(格式:)
返回String?
)已更新
这是因为在String(格式:,)中,参数必须不是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)
已更新 这是因为在String(格式:,)中,参数必须不是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)
字符串(格式:)
,除非您需要它。这是一种来自Foundation
框架的NSString
方法,它有几个后果:
Foundation
字符串连接到NSString
String(格式:)
返回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
}
字符串(格式:)
,除非您需要它。这是一种来自Foundation
框架的NSString
方法,它有几个后果:
Foundation
字符串连接到NSString
String(格式:)
返回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-)无法编译,因为字符串(格式…)返回一个非可选值。是否选中它,@vadian?答案是correct@AlexanderTkachenko是的,错误消息是条件绑定的初始值设定项必须具有可选类型,而不是“字符串”,谢谢重播。我尝试了示例1,但它抛出了一个错误“绑定必须具有可选类型,而不是字符串”@vadian抱歉,我将再次检查一次,@vadian-)没有编译,因为字符串(格式…)返回非可选的。您检查过它了吗,@vadian?答案是correct@AlexanderTkachenko是的,错误消息是条件绑定的初始值设定项必须具有可选类型,而不是“字符串”,谢谢重播。我尝试了示例1,但它抛出了一个错误“绑定必须具有可选类型,而不是字符串”@vadian抱歉,我会再次检查,我认为您的评论是正确的,并且无法像我希望的那样在一行中完成所有操作。谢谢我认为你的评论是正确的,没有办法像我所希望的那样在一行中完成这一切。谢谢在这种情况下,不要使用
字符串(格式:)
。请参阅我的答案。在这种情况下不要使用字符串(格式:)
。看我的答案。谢谢这也是有用的信息!谢谢,这也是有用的信息!