2015-11-18 3 views
0

В Swift мы можем перегрузить существующие унарные и двоичные операторы. На самом деле, когда я объявить переменную как Int, я могу просмотреть его постфиксную ++ заявление следующим образом:Как Swift реализуют операторы ++ и -?

postfix public funC++(inout x: Int) -> Int 

Но когда я перегружать суффикса ++ для моего собственного класса, я могу достичь такого же эффекта, как ++ для Int? (значение изменено после использования возвращаемого значения)

Или я просто не могу сделать то же самое, а пользовательские префиксные операторы не имеют никакого отношения к постфиксным операторам?

+2

Почему вы не смогли? Подсказка: имеется переменная temp :) –

+0

@ X.L.Ant Ага, я вижу! Большое спасибо. Это также означает, что мы должны ограничивать использование типов значений, верно? –

+0

Я не уверен, что понимаю, что вы имеете в виду. –

ответ

0

Это тривиальное с структурой (бесстыдно заимствование t4nhpt «s ответа)

postfix funC++ (inout foo: Foo) -> Foo { 
    let tmp = foo 
    foo.bar++ 
    return tmp 
} 

struct Foo { 
    var bar = 0 
} 

Труднее с классами, потому что они являются ссылочными типами. Вам нужно создать копию, которая начинается с увеличения. Следующие работы, но могут быть трудными для распространения на более сложные классы

postfix funC++ (inout foo: Foo) -> Foo { 
    let tmp = foo 
    foo = Foo(bar: tmp.bar + 1) 
    return tmp 
} 

class Foo { 
    var bar = 0 

    init(bar: Int) 
    { 
     self.bar = bar 
    } 
} 

var baz1 = Foo(bar: 1) 
let baz2 = baz1++ 
print("\(baz1.bar), \(baz2.bar)") // Prints 2, 1 
baz1++ 
print("\(baz1.bar), \(baz2.bar)") // Prints 3, 1 
0

Это то, что вы хотите?

prefix funC++ (inout foo: Foo) -> Foo { 

    foo.bar++ 
    return foo 
} 

class Foo { 
    var bar = 0 
} 

Использование:

var foo = Foo() 
    ++foo 

    print(foo.bar) 
+0

Я думаю, что предложение X.L.Ant - это то, что я хочу. Но все равно спасибо :) –

Смежные вопросы