Swift中的两个(或更多)选项

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)

(我不知道更深层嵌套的选项的合理应用.)