否定CGVector

时间:2016-07-02 08:16:46

标签: ios swift sprite-kit

我有

let impulse = CGVectorMake(CGFloat(Constants.impulse), 0)

如果不创建另一个CGVector,我怎么能得到它的负面效果?

我正在考虑在CGVector上创建一个扩展,以便有一个可以反转它的方法,但我还需要它来创建一个新的CGVector,而不是覆盖冲动。

另外,我说CGVector是参考类型吗?

2 个答案:

答案 0 :(得分:1)

您可以扩展CGVector方法:

public extension CGVector {
   func horizontalReverse() -> CGVector {
       return CGVector(dx:-self.dx,dy:self.dy)
   }
}

<强>用法

var impulse = CGVectorMake(CGFloat(Constants.impulse), 0)
impulse = impulse.horizontalReverse()

在Swift中, struct enum tuple 对象都是值类型,定义为类的对象是引用类型。分配值时会复制值类型数据,而引用传递引用类型数据并指向相同的基础数据。

别介意CGVector来源的声明。 在你的情况下,我们有let或var声明。

根据The Swift Programming Language

  

必须在使用常量和变量之前声明它们。您   使用 let 关键字和变量声明常量    var 关键字。

创建一个常量。一旦设置它,就无法更改其值。您仍然可以将其添加到其他内容并创建新变量。

var 会创建一个变量。所以你可以改变它的价值。

答案 1 :(得分:0)

改变结构

您可以在mutate内向var struct属性添加功能扩展。该函数需要标记为mutating

代码

这是代码

extension CGVector {
    mutating func negate() {
        dx *= -1
        dy *= -1
    }
}

实施例

var impulse = CGVector(dx: 1, dy: 2)
impulse.negate()
print(impulse) // CGVector(dx: -1.0, dy: -2.0)

第二行代码突变了原始脉冲值而没有创建新值。

  

请注意,要使用negate()变异功能,impulse必须是变种。