NS_SWIFT_NAME用于将C函数导入为类扩展

时间:2016-10-19 13:56:27

标签: swift swift3 objective-c-swift-bridge

我有两个C函数:

extern UIColor* LNRandomDarkColor();
extern UIColor* LNRandomLightColor();

作为练习,我尝试将它们作为UIColor的扩展方法导入Swift。

关注Apple" Swift的新功能"来自WWDC 2016的演示示例:

void CGContextFillPath(CGContextRef) NS_SWIFT_NAME(CGContext.fillPath(self:)); 

我试图类似地注释我的功能:

extern UIColor* LNRandomDarkColor() NS_SWIFT_NAME(UIColor.randomDarkColor());
extern UIColor* LNRandomLightColor() NS_SWIFT_NAME(UIColor.randomLightColor());

但是我收到以下警告:

  

' swift_name' attribute只能应用于函数声明   与原型

我在这里做错了什么?

更新:针对此问题打开SR-2999

1 个答案:

答案 0 :(得分:3)

这是部分结果。以下代码 - 根据以下示例创建 SE-0044 Import as member - 编译:

struct MyColor { };

UIColor * _Nonnull LNRandomDarkColor(void)
__attribute__((swift_name("MyColor.randomDarkColor()")));

并将C函数作为MyColor的静态成员函数导入 输入Swift:

let col = MyColor.randomDarkColor()

但是我无法将该函数作为成员函数导入 任何现有的类型,如UIColor

UIColor * _Nonnull LNRandomDarkColor(void)
__attribute__((swift_name("UIColor.randomDarkColor()")));
// warning: imported declaration 'LNRandomDarkColor' could not be mapped to 'UIColor.randomDarkColor()'

UIColor.randomDarkColor()无法编译)。我不知道这是故意限制还是错误。

使用NS_SWIFT_NAME宏代替swift_name 属性也不起作用:

UIColor * _Nonnull LNRandomDarkColor(void)
NS_SWIFT_NAME("MyColor.randomDarkColor()");
// warning: parameter of 'swift_name' attribute must be a Swift function name string