如何在中重写Swift++运算符?:三元运算符



我有以下代码

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

由于2.2我收到了折旧警告,有什么想法可以解决吗?

我有这样的解决方案:

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

但这不是很好。

怎么样:

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

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

column = (column + 1) % 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中为类型Int重新实现++(前缀/后缀增量运算符)和--(前缀/后置减量运算符),并使用自定义运算符、in-out参数和defer语句。

// 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
}

例如,以下使用三元运算符的操场代码在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

最新更新