我可以在enum上使用NS_SWIFT_NAME或NS_REFINED_FOR_SWIFT来映射全局函数到Swift属性



我有一个类似

的enum
typedef NS_ENUM(NSInteger, MyEnum) {
MyEnumCase1,
MyEnumCase2,
...
};

和将这些枚举值映射到任意字符串

的函数
FOUNDATION_EXPORT NSString *myEnumString(MyEnum val);

是否可以将其作为属性暴露给Swift ?

我试过了

FOUNDATION_EXPORT NSString *myEnumString(MyEnum val) NS_SWIFT_NAME(MyEnum.stringVal);

但是编译器给了我警告&;'swift_name'属性参数必须是指定Swift函数名的字符串字面值&;Swift调用者不会将stringVal视为MyEnum值的属性。

and I've try

FOUNDATION_EXPORT NSString *myEnumString(MyEnum val) NS_REFINED_FOR_SWIFT;

但是我的Swift扩展

extension MyEnum {
var stringVal {
return __myEnumString(self)
}
}

不能找到__myEnumString().

传递给NS_SWIFT_NAME的Swift函数名必须包含隐式的self:参数,并且要将其作为只读属性(而不是方法)导入,"getter":"必须加上前缀。在SE-0044 Import作为成员中可以找到各种示例。

因此,将C函数作为(只读)属性公开给Swift的正确语法是
NSString *myEnumString(MyEnum val)
NS_SWIFT_NAME(getter:MyEnum.stringVal(self:));
生成的Swift接口是
extension MyEnum {
public var stringVal: String { get }
}

,这在我的测试中按预期编译和运行:

print(MyEnum.case1.stringVal)

相关内容

  • 没有找到相关文章

最新更新