我一直在玩swift的选项。我经常使用条件展开模式:
var myOptional: AnyObject?
if let unwrapped = myOptional {
// do stuff
}
然而,有时候我有两个可选值,如果它们都是非零的话我只想使用它们。因此,我尝试使用以下语法:
var myOptional: AnyObject?
var myOtherOptional: AnyObject?
if let unwrapped = myOptional && let otherUnwrapped = myOtherOptional? {
// do stuff
}
我已经尝试将这两个部分放在括号等中,但似乎没有办法做到这一点。有没有理由说我不应该这样做?显然我可以在另一个语句中嵌入一个语句,但我更愿意将它全部放在一行。
答案 0 :(得分:6)
从Swift 1.2
开始,您可以解包多个选项和条件。
“if let”构造已经扩展到允许测试多个 单个if(或while)语句中的选项和保护条件 使用类似于通用约束的语法: 如果让a = foo(),b = bar(),其中a< b, let c = baz(){}这允许你测试多个选项并包含干预布尔条件,而不是 引入不希望的嵌套(即,避免“金字塔” 末日”)。
答案 1 :(得分:5)
因为该语言不支持它。
在the document中:
if
语句中任何条件的值必须具有符合BooleanType
协议的类型。条件也可以是 可选的绑定声明,如Optional Binding中所述。
condition
必须是“BooleanType
的表达式”或“可选的绑定声明”。
并且“可选绑定声明”不是“表达式”,因此您无法加入&&
。
相反,您可以使用switch
:
switch (myOptional, myOtherOptional) {
case let (.Some(unwrapped), .Some(otherUnwrapped)):
// do stuff
println("\(unwrapped), \(otherUnwrapped)")
default:
break
}
答案 2 :(得分:0)
唯一的方法是嵌套if语句。我认为这是因为苹果将其实现为syntactic sugar。所以预编译器转换
var myOptional: AnyObject?
if let unwrapped = myOptional {
// do stuff
}
到
var myOptional: AnyObject?
if myOptional != nil {
let unwrapped = myOptional
// do stuff
}
你当然可以在一个单独的if中做到这一点,但这会让你的代码变得更漂亮。在缺点方面,你不知道在调试时哪一个导致了崩溃。
有关详细信息,请参阅documentation
答案 3 :(得分:-1)
var myOptional: AnyObject?
var myOtherOptional: AnyObject?
let unwrapped: AnyObject? = myOptional, otherUnwrapped: AnyObject? = myOtherOptional?
if (unwrapped != nil && otherUnwrapped != nil) {
// Do Stuff
}
这是你可以做到的另一种方式。斯威夫特日复一日看起来更好