如何在 vector_float2 和 CGPoint* 之间进行转换?

Lea*_*s2D 6 vector objective-c type-conversion cgpoint xcode7

在 Objective-C 中,在 vector_float2 和 CGPoint* 之间转换的最简单/最快的方法是什么?

Apple 是否为这种类型转换提供任何内置功能?我注意到在示例应用程序的 2-3 个地方,他们只是调用 CGPointMake() 等来进行转换

是否可以简单地将 CGPoint* 转换为 vector_float2,反之亦然?这样做安全吗?


更新:显然解决方案是:

vector_float2 v = (vector_float2){(float)point.x, (float)point.y};
CGPoint p = CGPointMake(v.x, v.y);
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要经常这样做,这很麻烦,如果有一个 C 数组vector_float2*CGPoint*. 所以我正在寻找已经存在的解决方案或我可能忽略的非常简单的替代方案。

小智 3

我尝试简单地扩展CGPoint但似乎无法导入vector_float2;即使使用桥接头文件也不行。

// Doesn't work!!
extension CGPoint {
    init(vector: vector_float2)
    {
        self.x = CGFloat(vector.x)
        self.y = CGFloat(vector.y)
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,您确实有多种选择。您可以使用返回 a 的Float计算进行扩展,并扩展将其位置转换为 a :varCGFloatGKAgent2DCGPoint

extension Float {
    var f: CGFloat { return CGFloat(self) }
}

extension GKAgent2D {
    var cgposition: CGPoint {
        return CGPoint(x: self.position.x.f, y: self.position.y.f)
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以扩展CGPoint自身以接受两个Float

extension CGPoint {
    init(x: Float, y: Float) {
        self.x = CGFloat(x)
        self.y = CGFloat(y)
    }
}

extension GKAgent2D {
    var cgposition: CGPoint {
         // Note that the ".f" is gone from the example above
        return CGPoint(x: self.position.x, y: self.position.y)
    }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都可以像这样使用它:

let agent = GKAgent2D()
let point = agent.cgposition
Run Code Online (Sandbox Code Playgroud)