Как переписать оператор Swift ++ в ?: тернарный оператор

У меня есть следующий код

var column = 0

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

Начиная с версии 2.2 я получаю предупреждение об обесценивании, есть идеи, как это исправить?

У меня есть это решение:

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

Но это не очень приятно.


person patrickS    schedule 23.03.2016    source источник
comment
Это исходный код, который не был приятным. column = ++column это ужасная вещь, чтобы сказать. Именно поэтому оператор упраздняется.   -  person matt    schedule 23.03.2016


Ответы (2)


Как насчет:

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

Похоже, вы можете делать что-то вроде арифметики с часами. Если это так, это лучше передает суть:

column = (column + 1) % 2
person Lou Franco    schedule 23.03.2016

В простейшем случае вы можете заменить ++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
}

Более того, хотя я бы не рекомендовал использовать его в рабочем коде, вы можете переопределить ++ (префиксный/постфиксный оператор инкремента) и -- (префиксный/постфиксный оператор декремента) для типа Int в Swift 2.2 и Swift 3 с помощью пользовательские операторы, входные параметры и оператор отсрочки.

// 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
person Imanou Petit    schedule 01.04.2016
comment
Этот ответ требует большого заявления об отказе от ответственности «Не делайте этого в реальных проектах». - person Sulthan; 02.04.2016
comment
Помимо уродливых случаев, таких как column = ++column, есть ли какая-то особая причина, по которой это не рекомендуется? - person herme5; 23.03.2019