可选链接一步到位?

时间:2016-08-17 17:50:55

标签: swift xcode optional

为什么这样做(例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为零时,应用程序将崩溃。

问题: 有没有办法让上面的第二个例子工作或者不可能/正确?

3 个答案:

答案 0 :(得分:3)

  1. 避免冗余类型注释
  2. 除非您需要,否则请避免使用String(format:)。这是来自NSString框架的Foundation方法,它有几个结果:
    1. 需要导入Foundation
    2. 它隐含地将您的String连接到NSString
    3. 它不会在Swift 3中有效,因为桥接是明确的。
  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...)返回非可选Stringformat参数也必须是非可选的。

示例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)