2016-03-23 23 views
6

Mam następujący kodJak przepisać operatora Swift ++ w: trójargumentowy operator

var column = 0 

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

Od 2.2 dostaję ostrzeżenie amortyzacji, jakieś pomysły w jaki sposób mogę rozwiązać ten problem?

mam z tego rozwiązania:

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

Ale to nie jest naprawdę ładny.

+9

Jest przy kod, który nie był miły . 'column = ++ column' to straszna rzecz do powiedzenia. Właśnie dlatego operator jest zniesiony. – matt

Odpowiedz

12

Jak o:

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

Wygląda jak można robić coś takiego zegara arytmetyki. Jeśli tak, to dostaje punkt całej lepiej:

column = (column + 1) % 2 
0

W najprostszym przypadku można zastąpić ++column z column + 1:

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

Można również przepisać kod w IF- else instrukcja z operatorem +=:

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

Ponadto choć nie polecam go używać w kodzie produkcyjnym można reimplement ++ (operator prefix/postfix przyrost) oraz -- (prefix/postfix operatora ubytek) za typ Int w Swift 2.2 i Swift 3 z custom operators , in-out parameters i 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 
} 

Jako przykład, po zabaw dla dzieci, który wykorzystuje kod operatora trójskładnikowego nie generuje ostrzeżenia szybkimi 2,2 i szybkie 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

Ta odpowiedź wymaga dużego zastrzeżenia "Nie rób tego w prawdziwych projektach". – Sulthan