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

时间:2017-07-08 17:57:43

标签: swift

我们已经知道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 {
}

这是一种可接受的方法,用于评估多个布尔条件,,的行为与&&的行为相同,还是技术上不同?

6 个答案:

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

...
}

这是由于definition of && on Bool

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组成,并用逗号,

分隔。

一个简单的条件可以是布尔expressionoptional-binding-condition或其他东西:

enter image description here

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