She*_*kan 15 optional ios swift
在观看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??
Run Code Online (Sandbox Code Playgroud)
我打开了一个游乐场并开始尝试它,并意识到你可以根据需要编写任意?数量的游戏,然后用相同的数量打开它们!.我理解包装/解包变量的概念,但不能想到我想要包装值4,5或6次的情况.
Mar*_*n R 13
(更新为Swift> = 3)
"双选项"可能很有用,Swift博客条目"Optionals Case Study:valuesForKeys"描述了一个应用程序.
这是一个简化的例子:
let dict : [String : String?] = ["a" : "foo" , "b" : nil]
Run Code Online (Sandbox Code Playgroud)
是一个字典,可选字符串作为值.因此
let val = dict[key]
Run Code Online (Sandbox Code Playgroud)
有类型String??aka Optional<Optional<String>>.如果密钥不存在于字典中,则为.none(或nil).some(x).在第二种情况下,x是一个String?aka 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")
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
a: foo
b: nil
c: not present
Run Code Online (Sandbox Code Playgroud)
看看在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")
}
Run Code Online (Sandbox Code Playgroud)
或者,使用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")
}
Run Code Online (Sandbox Code Playgroud)
(我不知道更深层嵌套的选项的合理应用.)