考虑一个私有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 之外,任何事情都很难。