有没有办法将 CGPoint 的 NSArray<NSValue> 作为 [CGPoint] 公开给 Swift?

Is there a way to expose an NSArray<NSValue> of CGPoint as [CGPoint] to Swift?

我有这个属性:

@property (nonatomic) NSArray<NSValue *> *vertices;

其中顶点的类型为 CGPoint

我知道 swift 有一些方便的语言特性,例如 NS_SWIFT_NAME 可以更改函数名称,但我想知道是否有办法将 属性 公开为 [CGPoint]输入 Swift.

我问的是如何在 objective-c 语法中做到这一点,如何创建一个 objective-c API 在使用时将 "vertices" 公开为 [CGPoint] Swift.

谢谢。

根据我的理解,您需要在 Obj-C 中使用 CGPoint 数组,这样您就可以像这样使用 CGPoint 数组:

self.vertices = @[[NSValue valueWithCGPoint:CGPointMake(0, 10)],
                      [NSValue valueWithCGPoint:CGPointMake(10, 20)]];

找回那个点:

CGPoint pointValue = [self.vertices[0] CGPointValue];

希望这会有所帮助。

您不能在 Obj-C 中编写 Swift 中 [CGPoint] 类型的 属性。

你可以做的是用 NS_REFINED_FOR_SWIFT 注释你的 vertices 属性。这会将其作为名为 __vertices 的 属性 公开给 Swift。现在,您可以在 Swift 中的 class 上编写扩展,提供自己的 var vertices: [CGPoint] 计算 属性。它可能看起来像

var vertices: [CGPoint] {
    return __vertices.map({ [=10=].cgPointValue })
}

这种方法的缺点是每次从 Swift 访问 vertices 属性 时都必须分配一个全新的数组。但是如果你想公开一个[CGPoint](除了尝试看看你是否可以实现任何类型的缓存行为,你只创建新的[CGPoint]如果原始NSArray<NSValue *> 改变了)。