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就像是放入另一个盒子或数组中的盒子,但放入另一个数组中。