我可以使用@_silgen_name向 Swift 公开一个不是函数的 [Objective-]C 或C++符号吗?



考虑一个私有CFLocaleKey,后来被桥接为NSLocaleKey(NSString(,以便在内部与NSLocale一起使用:

CF_EXPORT const CFLocaleKey kCFLocaleTemperatureUnit API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

CFLocale_Private.h

引用此类内容的最明显方法是通过桥接标头。 但是有没有办法使用类似@_silgen_name的东西用纯 Swift 引用这个CF/NSLocaleKey

首先我尝试了:

@_silgen_name("NSLocaleTemperatureUnit")
public let temperatureUnit: NSLocale.Key

但是编译器抱怨:

@_silgen_name不适用于本声明

好的,让我们将其设为静态,但静态属性只能在类型上声明。 所以我尝试以其他NSLocaleKey值桥接到 Swift 的方式进行设置,作为NSLocale.Key的扩展:

extension NSLocale.Key {
@_silgen_name("NSLocaleTemperatureUnit")
public static let temperatureUnit: NSLocale.Key
}

即使这样,编译器也会抱怨与上述相同的错误。 这就是我卡住的地方。@_silgen_name只适用于函数吗? 我所要求的甚至可能用纯 Swift 实现吗?

截至撰写本文时(2017 年 8 月 8 日(,这目前不适用于任何版本的 Swift(3 或 4(。

如果没有标头声明,clang 不确定如何将 Swift 中的某些内容映射回 C。@_silgen_name@_cdecl处理函数,但不适用于变量。

苹果公司的 Swift 编译器工程师 Jordan Rose 在 Twitter 上证实了这一点。

tl;博士:

除了 func 之外,任何事情都很难。

最新更新