我正在研究Swift并尝试制作一些非常简单的应用程序。我遇到了一件我无法理解的事情:
写作时
var point = CGPoint(x: 0.6, y: 0.6)
let size = CGSize(width: 15, height: 25)
point.x *= size.width
point.y *= size.height
编译器认为没问题 但如果我在扩展名中写相同的内容
extension CGPoint {
func scale(bySize size: CGSize) {
self.x *= size.width
self.y *= size.height
}
}
我遇到错误找不到' * ='的重载接受函数中每一行提供的参数。
有人可以解释它的意思和区别吗?
点和大小在两种情况下是相同的,为什么在第一种情况下* =运算符存在但在第二种情况下它不存在?
答案 0 :(得分:3)
mutating func scale(bySize size: CGSize) {
self.x = self.x * size.width
self.y *= size.height
}
你必须声明该函数想要改变“by value”结构的状态。
“结构和枚举是值类型。 ...
如果您需要在特定方法中修改结构或枚举的属性,则可以选择改变该方法的行为。 ......“
Auszug aus:Apple Inc.“The Swift Programming Language。”iBooks。 https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
答案 1 :(得分:0)
您需要将关键字mutating
添加到您的实施中:
extension CGPoint {
mutating func scale(bySize size: CGSize) {
self.x *= size.width
self.y *= size.height
}
}
您可以在docs here:
中找到添加了扩展名的实例方法也可以修改(或变异) 实例本身。修改的结构和枚举方法 self或其属性必须将实例方法标记为 mutating ,只是 喜欢从原始实现中改变方法。
然后他们提供了这个例子:
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
// someInt is now 9