以编程方式向 cgpointmake 或 cgpoint 提供参数以从坐标对创建 cgpoints

Programmatically supply argument to cgpointmake or cgpoint to create cgpoints from coordinate pair

请原谅这个幼稚的问题,但是有没有直接的方法从坐标对创建 cgpoints 而无需单独提取 x 和 y 值。

我知道你能做到:

CGPoint point = CGPointMake(2, 3);

float x = 2;
float y = 3;

CGPoint p  = CGPointMake(x,y);

有没有办法直接从 (2,3) 创建一个点,而不用分别提取每个 x 和 y?

我问的原因是我必须从看起来像 [(2,3),(4,5),(6,7)] 等的坐标数组创建很多 CGPoints

提前感谢您的任何建议。

使用 mapCGPoint 初始化以及 xy 参数。

let coordinates = [(2,3),(4,5),(6,7)]
let points = coordinates.map { CGPoint(x: [=10=], y: ) }
print("\(type(of: points)): \(points)") // You'll get an `[CGPoint]` although they print as normal [(x, y)] tuples array.

Objective C 的解决方案可能如下所示:

CGFloat pointValues[] = {
    2, 3,
    4, 5,
    6, 7
};

for(int i = 0; i < sizeof(pointValues) / sizeof(CGFloat); i += 2) {
    CGPoint p = CGPointMake(pointValues[i], pointValues[i + 1]);
    // Do something with 'p'...
}

pointValues 数组是每个点的 x 和 y 值的一维数组。

或者,如果你可以使用 Objective C++,你可以简单地这样做:

CGPoint points[] {
    { 2, 3 },
    { 4, 5 },
    { 6, 7 }
};

好吧,如果你有戏剧天赋,也许是这样的

        // One big array
        float *   p1 = ( float [] ){ 1, 2, 3, 4, 5, 6, 7, 8 };
        float * end1 = p1 + 8;

        while ( p1 < end1 )
        {
            CGPoint point = CGPointMake ( * p1, * ( p1 + 1 ) );
            p1 += 2;

            NSLog ( @"Point ( %f, %f )", point.x, point.y );
        }

        // Array of 2D tuples
        // Not much difference though, maybe easier on the eyes?
        float *   p2 = ( float * )( float [][ 2 ] ){ { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
        float * end2 = p2 + 8;

        while ( p2 < end2 )
        {
            CGPoint point = CGPointMake( * p2, * ( p2 + 1 ) );
            p2 += 2;

            NSLog ( @"Point ( %f, %f )", point.x, point.y );
        }

Swift 可以推断出正确的初始化器,如果你映射一个元组数组,这些元组的类型与结果类型的可用初始化器相同:

let points = [(2,3),(4,5),(6,7)].map(CGPoint.init)