2016-03-23 6 views
6

Ich habe den folgenden CodeWie umschreiben Swift ++ Operator in: ternäre Operator

var column = 0 

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

Seit 2.2 ich eine Abwertung Warnung erhalten, irgendwelche Ideen, wie ich dieses Problem beheben?

Ich habe diese Lösung:

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

Aber das ist nicht wirklich schön.

+9

Es ist der ursprüngliche Code, der nicht schön war . 'Spalte = ++ Spalte' ist eine schreckliche Sache zu sagen. Genau deshalb wird der Betreiber abgeschafft. – matt

Antwort

12

Wie wäre:

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

Es sieht aus wie Sie so etwas wie Uhr Arithmetik könnte tun. Wenn ja, wird dies den Punkt über besser:

column = (column + 1) % 2 
0

Im einfachsten Fall, Sie ++column mit column + 1 ersetzen:

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

Sie können auch Ihren Code in einer umschreiben wenn- else Anweisung mit einem += Operator:

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

Außerdem obwohl ich es nicht in der Produktion Code würde empfehlen, können Sie für Typ Int in Swift 2.2 und Swift 3 mit custom operators++ (Präfix/postfix Inkrementoperator) und -- (Präfix/postfix Dekrementoperator) reimplementieren , in-out parameters und defer 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 
} 

Als Beispiel der folgende Code, der Spielplatz ternären Operator verwendet erzeugt keine Warnungen mit Swift 2.2 und 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 
+2

Diese Antwort benötigt einen großen Haftungsausschluss "Nicht in realen Projekten tun". – Sulthan