(针对 Swift >=3 更新)
“双选项”很有用,Swift 博客条目"Optionals Case Study: valuesForKeys" 描述了一个应用程序。
这是一个简化的例子:
let dict : [String : String?] = ["a" : "foo" , "b" : nil]
是一个以可选字符串作为值的字典。因此
let val = dict[key]
具有String?? 又名Optional<Optional<String>> 的类型。它是.none(或nil)
如果字典中不存在该键,否则为.some(x)。在第二
情况下,x 是 String? 又名 Optional<String> 并且可以是 .none(或 nil)
或.some(s),其中s 是一个字符串。
您可以使用嵌套的可选绑定来检查各种情况:
for key in ["a", "b", "c"] {
let val = dict[key]
if let x = val {
if let s = x {
print("\(key): \(s)")
} else {
print("\(key): nil")
}
} else {
print("\(key): not present")
}
}
输出:
a: foo
b: nil
c: not present
看看如何通过模式匹配实现同样的效果可能会很有启发性
在 switch 语句中:
let val = dict[key]
switch val {
case .some(.some(let s)):
print("\(key): \(s)")
case .some(.none):
print("\(key): nil")
case .none:
print("\(key): not present")
}
或者,使用x? 模式作为.some(x) 的同义词:
let val = dict[key]
switch val {
case let (s??):
print("\(key): \(s)")
case let (s?):
print("\(key): nil")
case nil:
print("\(key): not present")
}
(我不知道更深层次嵌套选项的合理应用程序。)