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

Ios Swift中的两个(或更多)选项,ios,swift,optional,Ios,Swift,Optional,在观看苹果关于LLDB调试器的视频时,我发现了一些我找不到解释的东西;他在写以下内容时谈到了可选值: var optional: String? = nil; //This is ok, a common optional var twice_optional: String?? = nil; //What is this and why's this useful?? 我打开了一个游乐场,开始尝试,意识到你可以写任意多的?,然后用相同数量的打开它们。我理解包装/展开变量的概念,但想不出我想包

在观看苹果关于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次的情况

var tripleOptional: String???

var tripleOptional: Optional<Optional<Optional<String>>>
var-tripleOptional:可选
我想不出它有什么有用的用途,但它确实存在,因为optionals对于任何类型的对象都是通用的。嵌套选项类似于放入另一个框或数组但放入另一个数组的框。

(针对Swift>=3更新)

“双选项”可能很有用,Swift博客条目描述了一个应用程序

以下是一个简化的示例:

let dict : [String : String?] = ["a" : "foo" , "b" : nil]
是具有可选字符串作为值的字典。所以

let val = dict[key]
具有类型
String???
aka
Optional
。它是
。无
(或
) 如果该键不在字典中,则
。否则,请选择部分(x)
。第二 大小写,
x
是一个
字符串?
aka
可选
,可以是
。无
(或
) 或
。其中
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?
模式作为
的同义词。某些(x)


(我不知道有哪种应用程序适合更深入的嵌套选项。)

是的,你说得对。但在某些情况下,即使是数组的数组也可能很有用。鉴于optionals是内置的语言,我认为它们可以控制在可选类型中包装值的次数,即使optional接受任何类型。好吧,让我们看看是否有人打开了我们的眼睛,但你为什么要限制它?如果您将可选限制为四个级别,99.99%的开发人员将永远不会注意到,0.01%的开发人员将非常非常生气。。。作为
将返回一个双精度可选值。@Cœur:是的,但可以用括号解决:
如果let value=(try?…)as。。。{…}
,因为optional的可选绑定不会添加另一个可选级别。然后,另一个示例,
UIApplication.shared.delegate?.window
是双可选的。您需要添加
来打开窗口。
let val = dict[key]
switch val {
case let (s??):
    print("\(key): \(s)")
case let (s?):
    print("\(key): nil")
case nil:
    print("\(key): not present")
}