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

时间:2014-12-01 09:26:00

标签: ios swift optional

在观看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次的情况。

2 个答案:

答案 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)。在第二 例如,xString?又名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>>>

我无法想到它的任何有用用途,但它的存在是因为选项是任何类型对象的通用工作。嵌套的选项就像放入另一个框或数组但放入另一个数组的框。