Ios Swift中的两个(或更多)选项
在观看苹果关于LLDB调试器的视频时,我发现了一些我找不到解释的东西;他在写以下内容时谈到了可选值: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?? 我打开了一个游乐场,开始尝试,意识到你可以写任意多的?,然后用相同数量的打开它们。我理解包装/展开变量的概念,但想不出我想包
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???
akaOptional
。它是。无
(或无
)
如果该键不在字典中,则。否则,请选择部分(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")
}