我正在浏览 swift 文档,在可选部分中,它讨论了使用问号 -?
-- 表示可能为零的变量。这可以在 if 语句中使用来检查 nil,但在文档中,他们将可选值分配给条件中的新变量。是否有一个原因?
例如,它出现在the docs与此类似:
// Declare an optional string (might be nil)
var optionalString: String? = "Hello"
// Assigns optionalString to new variable before checking if nil
if let string = optionalString {
println("\(optionalString) is not nil!")
}
else {
println("\(optionalString) is nil")
}
然而,这在测试中对我来说运行得很好:
var optionalString: String? = "Hello"
// Assigns optionalString to new variable before checking if nil
if optionalString {
println("\(optionalString) is not nil!")
}
else {
println("\(optionalString) is nil")
}
问题
是否有分配的理由optionalString
到一个新变量string
在条件语句中?
看一下有关的部分可选链接在文档中。在您引用的示例中,没有太大区别。但在其他情况下,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 != nil {
greeting = "Hello, \(optionalName)"
}
将其粘贴到游乐场中,以及存根实现checkTouchID()
返回true
,您将立即在结果区域中看到optionalName
getter 执行了两次。 (在更现实的场景中这将是一个问题,因为您可能不希望这样的代码隐式地checkTouchID()
or downloadFromServer()
or billApplePay()
两次。)如果您使用if-let
相反,您只需执行 getter 一次。
在一系列链式选项中(例如if let johnsStreet = john.residence?.address?.street
在上面链接的文档中),您不想在主体中重写整个链if
声明,更不用说重新计算它了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)