有没有办法将CGPoint的NSArray <nsvalue>作为[CGPoint]暴露给Swift?

时间:2017-07-11 06:17:01

标签: ios objective-c arrays swift core-graphics

我有这个属性:

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

其中顶点的类型为CGPoint

我知道swift有一些方便的语言功能,例如NS_SWIFT_NAME来更改函数名称,但我想知道是否有办法在Swift中将该属性公开为[CGPoint]类型。

我问的是如何在objective-c语法中执行此操作,如何创建一个公开&#34; vertices&#34;的Objective-c API。在Swift中使用时作为[CGPoint]。

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

获取这一点:

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

希望这会有所帮助。

答案 1 :(得分:0)

你不能在Obj-C中写一个Swift中[CGPoint]类型的属性。

您可以做的是使用verticesNS_REFINED_FOR_SWIFT媒体资源添加注释。这将把它作为名为__vertices的属性公开给Swift。现在,您可以在Swift中为您的类编写一个扩展,它提供了自己的var vertices: [CGPoint]计算属性。它可能看起来像

var vertices: [CGPoint] {
    return __vertices.map({ $0.cgPointValue })
}

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