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

wfauudbj  于 2023-03-17  发布在  Swift
关注(0)|答案(7)|浏览(140)

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

在操场上玩,逗号风格的格式似乎也适用于布尔条件,尽管我在任何地方都找不到这一点。

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

这是一种可接受的计算多个布尔条件的方法吗?,的行为与&&的行为是相同的,还是在技术上有所不同?

omvjsjqw

omvjsjqw1#

实际上结果是不一样的,假设你有两个语句,在它们之间用if和&&,如果在第一个语句中你用可选绑定创建了一个let,你就不能在第二个语句中看到它,而用逗号,你就能看到它。
逗号示例:

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

示例(&& E):

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

希望这个有用。

3zwjbxry

3zwjbxry2#

在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

wtzytmuj

wtzytmuj3#

当涉及到计算布尔逗号分隔条件时,认为逗号是一对或括号的最简单方式。

if true, false || true {}

它被转化成

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

tzdcorbm4#

下面是一种情况,它们相差很大,需要使用,
在初始化所有成员之前由闭包捕获的“self”

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卡在封口中。
&&更改为,将消 debugging 误。不幸的是,我不确定,是如何定义的,但我认为这很有趣。

smtd7mpg

smtd7mpg5#

https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list
Swift语法规定if语句condition-list可以由多个condition组成,这些condition之间用逗号隔开

简单条件可以是布尔值expressionoptional-binding-condition或其他值:

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

sshcrbum

sshcrbum6#

当模式匹配开关中的关联值时,使用,&&很重要,一个编译,另一个不编译(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()
    }
}
knpiaxh1

knpiaxh17#

如果你使用逗号,编译器会把整件事当作嵌套的if处理:

if conditionA, conditionB {

被当作

if conditionA {
    if conditionB {

这就是为什么

if let a = b, a > 10 {

工作但

if let a = b && a > 10 {

不!因为第一个事实上等于

if b != nil {
    let a = b!
    if a > 10 {

然而在第二种情况下,所有的事情都发生在同一个作用域中,并且在那个作用域中a没有被定义,这就是为什么you get

main.swift:3:17: error: cannot find 'a' in scope

相关问题