2016-03-23 20 views
6

Ho il seguente codiceCome riscrivere Swift ++ operatore in:? Ternario operatore

var column = 0 

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

Dal 2.2 Ho ricevuto un avviso di ammortamento, tutte le idee come posso risolvere questo problema?

ho questa soluzione:

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

ma questo non è davvero bello.

+9

E 'il codice originale che non era bello . 'column = ++ column' è una cosa terribile da dire. Questo è esattamente il motivo per cui l'operatore è stato abolito. – matt

risposta

12

ne dite:

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

Sembra che si potrebbe fare qualcosa di simile orologio aritmetica. Se è così, questo diventa il punto attraverso meglio:

column = (column + 1) % 2 
0

Nel caso più semplice, è possibile sostituire con ++columncolumn + 1:

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

Si può anche riscrivere il codice in un se: altra dichiarazione con un operatore +=:

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

Inoltre, anche se non mi consiglia di usarlo nel codice di produzione, è possibile reimplementare ++ (operatore prefisso/suffisso incremento) e -- (prefisso/suffisso decremento dell'operatore) per il tipo Int a Swift 2.2 e Swift 3 con custom operators , in-out parameters e 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 
} 

A titolo di esempio, il seguente codice di parco giochi che utilizza operatore ternario genera nessun avviso con Swift 2.2 e 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

Questa risposta richiede un disclaimer "Non farlo nei progetti reali". – Sulthan