Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Objective c N错误函数到可丢弃函数的快速桥接不起作用_Objective C_Xcode_Swift - Fatal编程技术网

Objective c N错误函数到可丢弃函数的快速桥接不起作用

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

我在一个Obj-c文件中使用了一个init函数(来自AWS SDK),其签名如下:

- (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中