在观看苹果公司有关LLDB调试器的视频时,我发现我找不到解释。他在撰写文章时谈论的是可选值:
var optional: String? = nil; //This is ok, a common optional var twice_optional: String?? = nil; //What is this and why's this useful??
我打开了一个操场,开始尝试,发现可以写任意?数量的文字,然后用相同数量的拆开它们!。我了解 包装/解包变量 的概念,但是无法想到要包装4、5或6次值的情况。
?
!
(已更新为Swift > = 3)
“ Double optionals”可能有用,Swift博客条目“ Optionals Case Study:valuesForKeys”描述了一个应用程序。
这是一个简化的示例:
let dict : [String : String?] = ["a" : "foo" , "b" : nil]
是具有可选字符串作为值的字典。因此
let val = dict[key]
具有String??aka 类型Optional<Optional<String>>。如果字典中不存在键,则为.none(或nil),.some(x)否则为。在第二种情况下,x是String?aka Optional<String>,可以是.none(或nil)或.some(s)其中s是字符串。
String??
Optional<Optional<String>>
.none
nil
.some(x)
x
String?
Optional<String>
.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
看看在切换语句中使用模式匹配如何实现相同的目标可能会很有启发性:
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):
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") }
(我不知道明智的应用程序用于更深层嵌套的可选内容。)