Swift中有两个(或更多)可选项

在观看关于LLDBdebugging器的苹果video的同时,我发现了一些我找不到的解释; 他在谈到可选的价值时写道:

var optional: String? = nil; //This is ok, a common optional var twice_optional: String?? = nil; //What is this and why's this useful?? 

我打开了一个操场,开始尝试,并意识到你可以写多达? 如你所愿,然后用相同数量的解包它们! 。 我理解包装/解包variables的概念,但不能想到我想包装一个值4,5或6次的情况。

(更新了Swift 2.)

“双选项”可能是有用的,Swift博客条目“Optionals案例研究:valuesForKeys”描述了一个应用程序。

这是一个简单的例子:

 let dict : [String : String?] = ["a" : "foo" , "b" : nil] 

是一个可选string作为值的字典。 因此

 let val = dict[key] 

有types的String?? 又名Optional<Optional<String>> 。 如果密钥不存在于字典中,则为.None (或nil ),否则为.Some(x) 。 在第二种情况下, x是一个String? aka Optional<String> ,可以是.None (或nil )或.None .Some(s) ,其中s是一个String。

您可以使用嵌套的可选绑定来检查各种情况:

 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-statement中如何通过模式匹配来实现同样的function可能是有益的:

 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") } 

(我不知道一个合理的应用程序,更深层嵌套optionals。)

 var tripleOptional: String??? 

和…一样

 var tripleOptional: Optional<Optional<Optional<String>>> 

我不能想到它的任何有用的用途,但它在那里,因为可选项是任何types的对象的通用工作。 嵌套optionals就像是放入另一个盒子或数组中的盒子,但放入另一个数组中。