为什么多个展开选项不可能?

时间:2015-01-27 12:56:21

标签: swift if-statement optional

我一直在玩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
}

我已经尝试将这两个部分放在括号等中,但似乎没有办法做到这一点。有没有理由说我不应该这样做?显然我可以在另一个语句中嵌入一个语句,但我更愿意将它全部放在一行。

4 个答案:

答案 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 
    }

这是你可以做到的另一种方式。斯威夫特日复一日看起来更好