Objective c N错误函数到可丢弃函数的快速桥接不起作用
我在一个Obj-c文件中使用了一个init函数(来自AWS SDK),其签名如下:Objective c N错误函数到可丢弃函数的快速桥接不起作用,objective-c,xcode,swift,Objective C,Xcode,Swift,我在一个Obj-c文件中使用了一个init函数(来自AWS SDK),其签名如下: - (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error; - (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue __attribute__((deprecated("Replaced by -initWith
- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error;
- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue __attribute__((deprecated("Replaced by -initWithDictionary:error:")));
哪些桥接到此签名模板:
请注意,它仍然建议使用类型为()
的错误
参数,这当然毫无意义。为什么不能正确地从swift签名中删除错误
,和/或为什么错误
参数()
?助手正确地说它抛出:
func foo() {}
func foo() throws {} // invalid redeclaration of `foo`
编辑:
原来问题是由超类弃用旧签名引起的:
- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error;
- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue __attribute__((deprecated("Replaced by -initWithDictionary:error:")));
如果我评论一下这种不赞成的话,它工作得很好,看起来这可能是斯威夫特的Obj-c桥接中的一个bug,不是一个bug,但无可否认是一个奇怪之处
在Swift中,通过是否抛出来重载函数是不合法的:
func foo() {}
func foo() throws {} // invalid redeclaration of `foo`
带有最后一个NSError
out参数的ObjC方法在Swift中转换为抛出的方法。因此,如果您有两个只在添加错误参数方面有所不同的ObjC方法,则无法使用Swift错误语法导入
取而代之的是NSError
参数变为throws
,但其参数标签仍然是Void
(又称()
)参数,以保持方法签名的唯一性。你这样称呼它:
// signature
func foo(thing: String, error: ()) throws
// call site
try foo("bar", error: ()) // enclose in do/catch as desired, or use `try!`
理论上,弃用应该会导致ObjC方法的非错误版本在Swift中不可见(从而允许错误版本使用Swift错误语法导入)。也许这只适用于从AvailabilityMacros.h
宏中获得的某些特定的弃用属性?(这可能值得一试。)
确保无错误ObjC方法不导入的另一个替代方法是用NS\u SWIFT\u UNAVAILABLE
标记它,您使用的是哪个Xcode版本?我的Xcode7.1.1按预期工作。不幸的是,仍然发生在7.1.1中