4

我有两个 C 函数:

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

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

遵循 Apple 在 WWDC 2016 示例中的“Swift 中的新功能”演示文稿:

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' 属性只能应用于带有原型的函数声明

我在这里做错了什么?


更新:为此问题打开了SR-2999 。

4

1 回答 1

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
于 2016-10-19T20:33:39.207 回答