我们已经知道multiple optional bindings can be used in a single if/guard statement by separating them with commas,但不知道&&
,例如
// 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 {
}
这是一种可接受的方法,用于评估多个布尔条件,,
的行为与&&
的行为相同,还是技术上不同?
答案 0 :(得分:16)
实际上结果并不相同。假设你在if和&&中有2个陈述。它们之间。如果在第一个中使用可选绑定创建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'
}
希望这有帮助。
答案 1 :(得分:7)
在Swift 3中,条件子句中的where
关键字替换为逗号。
所以像if 1 == 1, 2 == 2 {}
这样的声明说“如果1等于1,其中2等于2 ......”
使用&&
而不是,
读取条件语句可能最简单,但结果是相同的。
您可以在Swift Evolution提案中详细了解Swift 3中的更改详情:https://github.com/apple/swift-evolution/blob/master/proposals/0099-conditionclauses.md
答案 2 :(得分:2)
在某些情况下,它们之间有很大差异,需要,
。以下代码将产生
在初始化所有成员之前,闭包捕获了
class User: NSObject, NSCoding {
public var profiles: [Profile] = []
private var selectedProfileIndex : Int = 0
public required init?(coder aDecoder: NSCoder) {
// self.profiles initialized here
let selectedIndex : Int = 100
if 0 <= selectedIndex && selectedIndex < self.profiles.count { <--- error here
self.selectedProfileIndex = selectedIndex
}
super.init()
}
...
}
static func && (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
RHS上的selectedIndex < self.profiles.count
被闭包了。
将&&
更改为,
将消除错误。不幸的是,我不确定,
的定义方式,但是我认为这很有趣。
答案 3 :(得分:0)
当模式匹配开关中的关联值时,使用,
或&&
时很重要。一个编译,另一个不编译(Swift 5.1)。编译(&&
):
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()
}
}
答案 4 :(得分:0)
在评估以逗号分隔的布尔条件时,想到逗号的简单方法是使用一对或方括号。 所以,如果你有
if true, false || true {}
它变成了
if true && (false || true) {}
答案 5 :(得分:-1)
https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list
Swift语法说if
语句condition-list
可以由多个condition
组成,并用逗号,
一个简单的条件可以是布尔expression
,optional-binding-condition
或其他东西:
因此,使用逗号分隔多个表达式非常好。