Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 一步可选链接?_Swift_Xcode_Optional - Fatal编程技术网

Swift 一步可选链接?

Swift 一步可选链接?,swift,xcode,optional,Swift,Xcode,Optional,为什么这样做(示例1): 但不是这个(示例2): 在第二个示例中,Xcode抛出一个错误,并希望zip像这样展开: 字符串(格式:“tel:%@”,(Model.selectedLocation?.zip)!) 但如果我这样做,当zip为零时,应用程序将崩溃 问题: 有没有办法使上面的第二个示例起作用或者不可能/正确?严格来说,示例2既不是可选的绑定,也不是可选的链接,因为String(format…返回一个非可选的String,并且format参数也必须是非可选的 示例1是处理选项的正确且推荐

为什么这样做(示例1):

但不是这个(示例2):

在第二个示例中,Xcode抛出一个错误,并希望
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
  • 它在Swift 3中不起作用,因为桥接是显式的
  • 这里的根本问题是
    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
  • 它在Swift 3中不起作用,因为桥接是显式的
  • 这里的根本问题是
    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抱歉,我会再次检查,我认为您的评论是正确的,并且无法像我希望的那样在一行中完成所有操作。谢谢我认为你的评论是正确的,没有办法像我所希望的那样在一行中完成这一切。谢谢在这种情况下,不要使用
    字符串(格式:)
    。请参阅我的答案。在这种情况下不要使用
    字符串(格式:)
    。看我的答案。谢谢这也是有用的信息!谢谢,这也是有用的信息!