在观看Apple关于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次的情况。
答案 0 :(得分:13)
(针对Swift更新> = 3)
“Double optionals”非常有用,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")
}
(我不知道更深层嵌套的选项的合理应用。)
答案 1 :(得分:2)
var tripleOptional: String???
与
相同var tripleOptional: Optional<Optional<Optional<String>>>
我无法想到它的任何有用用途,但它的存在是因为选项是任何类型对象的通用工作。嵌套的选项就像放入另一个框或数组但放入另一个数组的框。