在Swift中用逗号分隔多个if条件

在Swift中用逗号分隔多个if条件,swift,Swift,我们已经知道了,但是没有使用&例如 // Works as expected if let a = someOpt, b = someOtherOpt { } // Crashes if let a = someOpt && b = someOtherOpt { } 在操场上玩,逗号样式的格式似乎也适用于布尔条件,尽管我在任何地方都找不到。e、 g if 1 == 1, 2 == 2 { } // Seems to be the same as if 1 == 1 &&

我们已经知道了,但是没有使用
&
例如

// Works as expected
if let a = someOpt, b = someOtherOpt {
}
// Crashes
if let a = someOpt && b = someOtherOpt {
}
在操场上玩,逗号样式的格式似乎也适用于布尔条件,尽管我在任何地方都找不到。e、 g

if 1 == 1, 2 == 2 {
}
// Seems to be the same as
if 1 == 1 && 2 == 2 {
}

这是评估多个布尔条件的公认方法吗?,的行为是否与
&&
的行为相同?还是在技术上不同?

在Swift 3中,条件子句中的
where
关键字被替换为逗号

所以像
if 1==1,2==2{}
这样的语句是说“if 1=1,其中2=2…”

阅读带有
&&
而不是
的条件语句可能是最容易的,但结果是相同的


您可以在Swift演进方案中阅读更多有关Swift 3变更的详细信息:

事实上,结果并不相同。假设在if和&之间有两条语句。如果在第一个语句中使用可选绑定创建let,那么在第二个语句中将看不到它。相反,使用逗号,您将

逗号示例:

if let cell = tableView.cellForRow(at: IndexPath(row: n, section: 0)), cell.isSelected {
    //Everything ok
}
&&例如:

if let cell = tableView.cellForRow(at: IndexPath(row: n, section: 0)) && cell.isSelected {
    //ERROR: Use of unresolved identifier 'cell'              
}

希望这能有所帮助。

这里有一个例子,它们之间的差异足以要求使用
。下面的代码将生成

在初始化所有成员之前由闭包捕获的“self”

RHS上的
selectedIndex
处于关闭状态

&&
更改为
将消除该错误。不幸的是,我不确定
是如何定义的,但我认为这很有趣。

Swift语法规定,
if
语句
条件列表
可以由多个
条件
组成,条件之间用逗号分隔

简单条件可以是布尔
表达式
、可选绑定条件
或其他:


因此,使用逗号分隔多个表达式是非常好的。

当模式匹配开关中的关联值时,使用
&&
时很重要。一个编译,另一个不会(Swift 5.1)。这将编译(
&&
):


在计算布尔逗号分隔条件时,最容易想到的逗号是一对或括号。 所以,如果你有

if true, false || true {}
它被转化为

if true && (false || true) {}

所以首先计算
1==1
?如果
1==1
(假设)是
false
,那么
2==2
是否仍会被计算,或者是否会像
&
那样被跳过?
2==2
被跳过,就像
&
does条件是按直接顺序计算的一样,尽管人们可以认为如果1等于1,其中2等于2,那么答案中的
意味着首先计算
之后的部分。不是。顺序是直接的:
1==1
,然后是
2==2
。另外,请阅读
&&
if let
语句中的差异。您是正确的,但答案已经说明了您描述的行为,问题是询问如何具体计算布尔条件。是的,但在另一个答案中,人们说结果是相同的,而事实并非如此。这对来这里阅读答案的人来说是危险的,这就是我为什么要说明的原因。
enum SomeEnum {
    case integer(Int)
}

func process(someEnum: SomeEnum) {
    switch someEnum {
    // Compiles
    case .integer(let integer) where integer > 10 && integer < 10:
        print("hi")
    default:
        fatalError()
    }
}
enum SomeEnum {
    case integer(Int)
}

func process(someEnum: SomeEnum) {
    switch someEnum {
    // Compiles
    case .integer(let integer) where integer > 10, integer < 10:
        print("hi")
    default:
        fatalError()
    }
}
if true, false || true {}
if true && (false || true) {}