我有
let impulse = CGVectorMake(CGFloat(Constants.impulse), 0)
如果不创建另一个CGVector,我怎么能得到它的负面效果?
我正在考虑在CGVector上创建一个扩展,以便有一个可以反转它的方法,但我还需要它来创建一个新的CGVector,而不是覆盖冲动。
另外,我说CGVector是参考类型吗?
答案 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
必须是变种。