这似乎是一个错误,并在 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 的 getter 中的 sq 指的是整数本身,为什么 nn.sq 之后保持 5?

让我们看看如果我们只添加一个 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() 这样的 func 会更合理并且已经证明,但我只想知道为什么它在属性 getter 中不起作用。

最佳答案

几个解决方案:

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

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

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

然后你可以调用 n.sq() 它会做你想要的

关于ios - Swift:当我们对 Int 进行扩展时,属性 getter 中的 "self"应该是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31461650/

10-10 18:33