Swift转换后,Objective-C方法签名是相同的

时间:2015-09-23 17:29:16

标签: ios objective-c swift swift2

我的objective-c库中有两个方法,在转换为Swift之后,似乎有相同的方法签名。它们在Objective-C中如下:

- (void)doSomething:(UIViewController *)viewController __attribute__((deprecated));
- (BOOL)doSomething:(UIViewController *)viewController error:(NSError **)error;

根据我在Objective-C中使用NSErrors + BOOL返回值的Swift方法转换,我知道这些方法最终会有以下Swift方法签名:

func doSomething(viewController: UIViewController)
func doSomething(viewController: UIViewController) throws

由于在Objective-C中实际上不推荐第一个调用,是否有办法强制对此方法的调用使用第二个签名(确保我可以利用抛出的错误)?

我试图按以下方式调用该方法:

do {
    try myObjectInstance.doSomething(self)
} catch let error as NSError {
    print(error)
}

这种方法似乎默认为第一个声明,它给了我一个警告:a)该方法已被弃用,b)没有什么可以捕获的,因为没有抛出错误。

1 个答案:

答案 0 :(得分:0)

您可以使用NS_SWIFT_UNAVAILABLE宏标记它对Swift不可用:

- (void)doSomething:(UIViewController *)viewController
   __attribute__((deprecated)) NS_SWIFT_UNAVAILABLE("use the throwing variant");

然后Swift编译器将选择唯一可用的方法,即另一个方法。

(在我的测试中,这似乎打破了自动填充功能 - 您可能需要file a bug来解决此问题。)