【问题标题】:How to rewrite Swift ++ operator in ?: ternary operator如何在 ? 中重写 Swift ++ 运算符:三元运算符
【发布时间】:2016-03-23 13:03:30
【问题描述】:

我有以下代码

var column = 0

column = column >= 2 ? 0 : ++column

从 2.2 开始,我收到了折旧警告,有什么办法可以解决这个问题吗?

我有这个解决方案:

if column >= 2 {
    column = 0
} else {
    column += 1
}

但这不是很好。

【问题讨论】:

  • 原来的代码不好。 column = ++column 说起来很可怕。这正是运营商被废除的原因。

标签: swift swift2.2


【解决方案1】:

怎么样:

column = (column >= 2) ? 0 : column+1

看起来你可能正在做一些类似时钟算术的事情。如果是这样,这就更好地说明了这一点:

column = (column + 1) % 2

【讨论】:

    【解决方案2】:

    在最简单的情况下,您可以将++column 替换为column + 1

    var column = 0
    column = column >= 2 ? 0 : column + 1
    

    您还可以使用 += 运算符在 if-else 语句中重写您的代码:

    var column = 0
    if column >= 2 {
        column = 0
    } else {
        column += 1
    }
    

    此外,虽然我不建议在生产代码中使用它,但您可以为 @ 类型重新实现 ++(前缀/后缀递增运算符)和 --(前缀/后缀递减运算符) Swift 2.2 和 Swift 3 中的 987654331@ 与 custom operatorsin-out parametersdefer statement

    // Swift 2.2
    
    prefix operator ++ {}
    prefix operator -- {}
    postfix operator ++ {}
    postfix operator -- {}
    
    prefix func ++(inout a: Int) -> Int {
        a += 1
        return a
    }
    
    prefix func --(inout a: Int) -> Int {
        a -= 1
        return a
    }
    
    postfix func ++(inout a: Int) -> Int {
        defer { a += 1 }
        return a
    }
    
    postfix func --(inout a: Int) -> Int {
        defer { a -= 1 }
        return a
    }
    
    // Swift 3
    
    prefix operator ++
    prefix operator --
    postfix operator ++
    postfix operator --
    
    @discardableResult prefix func ++( a: inout Int) -> Int {
        a += 1
        return a
    }
    
    @discardableResult prefix func --( a: inout Int) -> Int {
        a -= 1
        return a
    }
    
    @discardableResult postfix func ++( a: inout Int) -> Int {
        defer { a += 1 }
        return a
    }
    
    @discardableResult postfix func --( a: inout Int) -> Int {
        defer { a -= 1 }
        return a
    }
    

    例如,以下使用三元运算符的 Playground 代码在 Swift 2.2 和 Swift 3 中不会生成警告:

    var a = 10
    print(a++) // prints 10
    print(a) // prints 11
    
    var b = 10
    print(--b) // prints 9
    print(b) // prints 9
    
    var column = 0
    column = column >= 2 ? 0 : ++column
    print(column) // prints 1
    

    【讨论】:

    • 这个答案需要一个很大的“不要在实际项目中这样做”免责声明。
    • 除了column = ++column这种丑陋的情况,还有什么特别不推荐的原因吗?
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2018-09-26
    • 2021-04-14
    • 2021-10-06
    • 2018-09-10
    相关资源
    最近更新 更多