为什么在这里使用额外的let语句?

时间:2014-06-02 23:30:48

标签: swift

我正在使用快速语言查看苹果的iBook,他们使用这个片段:

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

如果我理解正确,这只是将name设置为与optionalName相同。为什么Apple会使用let name = optionalName?使用if optionalName {...会不会更容易?从玩耍看似乎有这种行为。

2 个答案:

答案 0 :(得分:3)

if-let构造在这样的简单情况下是多余的,但在更复杂的代码中它可能是有用的。你可以用很多相同的方式使用它,你可以在(Obj)C条件中使用赋值(记住if (self = [super init]))。

例如,如果被测试的可选项是计算属性:

var optionalName: String? {
get {
    if checkTouchID() {
        return "John Appleseed"
    } else {
        return nil
    }
}
}
var greeting = "Hello!"
if optionalName {
    greeting = "Hello, \(optionalName)"
}

将其粘贴到游乐场,以及返回checkTouchID()的{​​{1}}存根实现,然后您会立即在结果区域中看到true获取器正在执行两次。如果您改为使用optionalName构造,那么您只会执行一次getter。

如果你有一系列链式可选调用,这也是正确的 - 也许更常用 - 如the docs中的if-let示例所示。你不想在if let johnsStreet = john.residence?.address?.street语句的主体中重写整个链,更不用说重新计算了它。

答案 1 :(得分:-1)

不,您无法使用if optionalName

  

在if语句中,条件必须是布尔表达式 - this   表示如果得分{...}等代码是错误,而不是隐含的   比较为零。

它在Swift的Guided Tour中提到here