4

似乎这是一个错误并在 Xcode 7 中使用 Swift(2b3) 解决

为了方便观察,我们把代码贴到playground,结果会在评论中说明。

extension Int {
    var sq: Int {
        mutating get {
            self                       //5
            self = self * self         //25
            return self                //25    Here 25 is made
        }
    }
}

var n: Int = 5                         //5
n.sq                                   //25
n                                      //5      Why isn't 25?

我的问题是,如果self在属性的 gettersq中指的是整数本身,为什么在做n之后保留 5 n.sq

让我们看看如果我们只添加一个 setter 会发生什么:

extension Int {
    var sq: Int {
        mutating get {
            self                       //5
            self = self * self         //25
            return self                //25    Here 25 is made
        }

        //It's not making any sense, just for testing what's self referring to
        set {
        }
    }
}

var n: Int = 5                         //5
n.sq                                   //25
n                                      //25     It's just what we want!

那么,案例上部的问题是什么?

顺便说一句,在这种情况下,实现类似的函数sq()会更合理,并且已经证明,但我只想知道为什么它在属性 getter 中不起作用。

4

1 回答 1

0

几个解决方案:

将行更改为n.sqn = n.sq因为 get 方法返回一个基于 self 的值并且并没有真正改变它。

如果您只想以当前方式使用方法,请在扩展中编写如下:

mutating func sq() {
    self = self * self
}

然后你可以打电话 n.sq(),它会做你想要的

于 2015-07-16T18:31:10.207 回答