Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用@_silgen_name公开[Objective-]C或C++;不是Swift功能的符号?_Swift - Fatal编程技术网

我可以使用@_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编译器开发团队获得答案,即使它可能不是您想要的答案。有趣的问答!