我正在使用快速语言查看苹果的iBook,他们使用这个片段:
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
如果我理解正确,这只是将name设置为与optionalName相同。为什么Apple会使用let name = optionalName
?使用if optionalName {...
会不会更容易?从玩耍看似乎有这种行为。
答案 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。