我可以使用@_silgen_name公开[Objective-]C或C++;不是Swift功能的符号?
考虑一个私有的我可以使用@_silgen_name公开[Objective-]C或C++;不是Swift功能的符号?,swift,Swift,考虑一个私有的CFLocaleKey,它后来作为NSLocaleKey(NSString)桥接,以便在内部与NSLocale一起使用: CF_EXPORT const CFLocaleKey kCFLocaleTemperatureUnit API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)); 引用此类内容的最明显方式是通过桥接头。但是,有没有一种方法可以用纯Swift引用这个CF/NSLocaleKey,比如使
CFLocaleKey
,它后来作为NSLocaleKey
(NSString
)桥接,以便在内部与NSLocale
一起使用:
CF_EXPORT const CFLocaleKey kCFLocaleTemperatureUnit API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
引用此类内容的最明显方式是通过桥接头。但是,有没有一种方法可以用纯Swift引用这个CF
/NSLocaleKey
,比如使用@\u silgen\u name
首先,我尝试:
@_silgen_name("NSLocaleTemperatureUnit")
public let temperatureUnit: NSLocale.Key
但编译器抱怨:
@_silgen_名称不能应用于此声明
好的,让我们将其设为静态,但是静态属性只能在类型上声明。因此,我尝试以其他NSLocaleKey
值桥接到Swift的方式设置它,作为NSLocale.Key的扩展:
extension NSLocale.Key {
@_silgen_name("NSLocaleTemperatureUnit")
public static let temperatureUnit: NSLocale.Key
}
即使这样,编译器也会抱怨与上面相同的错误。这就是我被卡住的地方。@\u silgen\u name
是否仅适用于函数?我想问的是,纯Swift是否可能实现?在撰写本文(2017年8月8日)时,这在任何版本的Swift(3或4)中都是不可能实现的
在没有标题声明的情况下,clang不知道如何将Swift中的内容映射回C。@\u silgen\u name
和@\u cdecl
处理函数,但不处理变量
这一点得到了Jordan Rose的证实,他是苹果公司的一名敏捷编译工程师
tl;博士:
我相信@\u silgen\u name
只是一个修饰函数的属性,我从来没有见过它用于类型。这可能不适用于您的情况,但看看,可能(使用@\u cdecl
属性并将类型强制转换为UnsafeRawPointer
)可能至少能对您的问题提供一些见解。我们肯定离您越来越近了,但是@\u cdecl
只能用于“func”声明。谢谢你朝着正确的方向迈出了一步@dfri看起来有了我们的答案:很高兴直接从Swift编译器开发团队获得答案,即使它可能不是您想要的答案。有趣的问答!