可选绑定
斯威夫特3&4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
斯威夫特2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
如果是,则代码let booleanValue = booleanValue
返回false
,并且该块不执行。如果不是,则此代码定义一个名为type的新变量(而不是可选的)。booleanValue
nil
if
booleanValue
nil
booleanValue
Bool
Bool?
Swift 3和4代码booleanValue
(以及Swift 2.2代码where booleanValue
)将评估新booleanValue: Bool
变量。如果为true,则该if
块将使用booleanValue: Bool
范围内新定义的变量执行(允许选择在该if
块内再次引用绑定值)。
注意:将绑定的常量/变量命名为可选常量/变量(例如)是一种Swift约定let booleanValue = booleanValue
。这种技术称为可变阴影。您可以打破常规并使用let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
。我指出这一点是为了帮助您了解正在发生的事情。我建议使用可变阴影。
其他方法
无合并
对于这种特定情况,零合并是显而易见的
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
检查false
不清楚
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
注意:if !booleanValue ?? false
不编译。
强制展开可选(避免)
强制展开会增加某些人在将来进行更改但编译时崩溃但在运行时崩溃的机会。因此,我会避免这样的事情:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
通用方法
尽管此堆栈溢出问题专门询问如何检查aBool?
是否true
在if
语句内,但有助于确定一种通用方法,即检查true,false还是将未包装的值与其他表达式组合。
随着表达式变得越来越复杂,我发现可选绑定方法比其他方法更灵活,更易于理解。注意与任何可选类型(即可选结合的作品Int?
,String?
等等)。