这似乎是一个错误,并在 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
指的是整数本身,为什么 n
在 n.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/