Swift if语句 - 用逗号分隔的多个条件?

Mar*_*eon 27 if-statement optional ios swift

看一个Swift 示例:

if let sourceViewController = sender.sourceViewController as? MealViewController, meal = sourceViewController.meal {
    ...
}
Run Code Online (Sandbox Code Playgroud)

该文件指出:

...代码将视图控制器分配给本地常量sourceViewController,并检查sourceViewController上的meal属性是否为nil.

问题:当用逗号分隔时,Swift是否允许你在if语句中有多个条件(如本例中的逗号后面所示MealViewController)?

在文档中没有看到这个.

Luc*_*tti 54

你写的时候是的

if let a = optA, let b = optB, let c = optC {

}
Run Code Online (Sandbox Code Playgroud)

IF如果所有分配都正确完成, Swift会执行唯一的主体.

更多

该技术的另一个特点是:分配按顺序完成.

因此,只有正确分配了值a,Swift才会尝试为其赋值b.等等.

这允许您像这样使用先前定义的变量/常量

if let a = optA, let b = a.optB {

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下(在第二次分配中)我们正在安全使用,a因为我们知道如果执行该代码,则a填充了有效值.


Joa*_*son 17

是的,快速的文档有这个说法;

您可以在单个if语句中包含多个可选绑定,并使用where子句检查布尔条件:

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}   
// Prints "4 < 42 < 100"

if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }   
    }   
}   
// Prints "4 < 42 < 100"
Run Code Online (Sandbox Code Playgroud)

  • [`where`子句不再像Swift 3中那样使用](https://github.com/apple/swift-evolution/blob/master/proposals/0099-conditionclauses.md),只需将`where`替换为`逗号代替. (9认同)
  • @mretondo,至少在Swift 4.1中,你的例子给出了错误*Expected','连接多子句条件的部分*,以及通过用`,`替换`&&`来修复的建议.使用逗号是一种确保没有可选项的方法,而使用`&&`表示布尔测试.要使用`&&',你必须这样说:`if optA!= nil && optB!= nil && optC!= nil {`.或者,如果您需要块内的那些未包装的变量,您可以再次使用逗号:`如果让a = optA,a> 1,让b = optB,b> 1,让c = optC,c> 1 {return a + b + c}` (5认同)
  • 我自己从来不知道`where`条款,直到在文档中查找它,你每天都学到新的东西...... :) (3认同)
  • 仅供参考,`if`语句中的`where`子句在Swift 4+中不再有效.我相信它已在Swift 3中删除但我找不到参考) (3认同)