超载' \ * ='接受CGFloat

时间:2014-06-16 19:16:00

标签: swift

我正在研究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
    }
}

我遇到错误找不到' * ='的重载接受函数中每一行提供的参数

有人可以解释它的意思和区别吗?

点和大小在两种情况下是相同的,为什么在第一种情况下* =运算符存在但在第二种情况下它不存在?

2 个答案:

答案 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