Objective-C 方法签名在 Swift 转换后是一样的

Posted

技术标签:

【中文标题】Objective-C 方法签名在 Swift 转换后是一样的【英文标题】:Objective-C method signatures are the same after Swift conversion 【发布时间】:2015-09-23 17:29:15 【问题描述】:

我的 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】:

您可以使用NS_SWIFT_UNAVAILABLE 宏将其标记为对 Swift 不可用:

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

那么 Swift 编译器会选择唯一可用的方法,也就是另一个。

(在我的测试中,这似乎破坏了自动完成功能——您可能想file a bug 对此。)

【讨论】:

哦,如果这是唯一的方法,那么库更新将是不幸的。也就是说,有一种解决方案总比没有好!谢谢!! 大概,您还可以创建一个单独的 Obj-C 方法(在一个类别或其他东西中),它包含在 Swift 目标中,只是为了帮助进行互操作,并调用适当的方法。

以上是关于Objective-C 方法签名在 Swift 转换后是一样的的主要内容,如果未能解决你的问题,请参考以下文章

如何将此方法从 Objective-C 转换为 Swift?

Swift编程语言中的方法引用(基于2.2版本)

Swift 项目的代码签名问题

如何在 Swift 中调用 Objective-C 类别方法

在 Swift 中使用 Objective-C 类别的正确方法是啥?

Swift 中的 Objective-C 方法参数