2015-11-18 68 views
0

它出现在Swift中,我们可以超载现有的一元和二元运算符。事实上,当我声明一个变量作为诠释,我可以按如下查看其后缀++声明:Swift如何实现运算符++和 - ?

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

但是,当我重载后缀++我自己的课,我可以达到与++相同的效果。 (价值改变后使用返回值)

或者我只是不能做同样的事情,自定义前缀运算符没有区别于后缀运算符?

+2

为什么你不能?提示:有一个临时变量:) –

+0

@ X.L.Ant啊哈我看到了!非常感谢。这也意味着我们应该限制价值类型的使用,对吗? –

+0

我不确定我明白你的意思。 –

回答

0

这是琐碎的结构体(无耻借款t4nhpt的答案)

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的建议是我想要的。但是,无论如何感谢:) –