如何通过 Swift 扩展实现委托方法

Posted

技术标签:

【中文标题】如何通过 Swift 扩展实现委托方法【英文标题】:How do I implement delegate methods through Swift extension 【发布时间】:2016-05-25 07:46:33 【问题描述】:

我的项目是 Obj-C 和 Swift 的混合体,我正在尝试使用 Swift 扩展我的 AppDelegate 类。

所以现在我有AppDelegate.mAppDelegate.hAppDelegate.swift。大多数方法都在 Obj-C 文件中,但我尝试只实现其中一种方法:

extension AppDelegate 

    func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool 

    

然而它在抱怨:

AppDelegate.swift:11:10: Method 'application(_:continueUserActivity:restorationHandler:)' with Objective-C selector 'application:continueUserActivity:restorationHandler:' conflicts with previous declaration with the same Objective-C selector

这是 Swift 扩展的限制吗?或者有没有办法在我的 Swift 扩展文件中实现这个委托方法?

【问题讨论】:

如果你想覆盖一个现有的方法,你将不得不子类化而不是写一个扩展 @simpleBob 不是现有方法,我的 Obj-C 类中没有实现。 【参考方案1】:

你不能这样做。 AppDelegate 已经定义了这个方法(UIApplicationDelegate 协议是这么说的)。

最简单的解决方案是用 swift 重写AppDelegate

您还有更困难的解决方案 - 从您的 AppDelegate 中删除 UIApplicationDelegate 并在您的扩展中实现此协议。如果您的AppDelegate 相当大,它可能会引发意外错误。

【讨论】:

好的,假设这是一个视图控制器,而不是需要实现的TableViewDelegate 方法。我可以扩展我的视图控制器并在那里实现这些方法吗?如果是这样,它如何在那种情况下工作,但不是在这里? (P.S. 反正我的 app delegate 没那么大,所以用 Swift 重写也没什么大不了的) 如果你有SomeViewController UIViewController 的子类)和这个VC的扩展,协议为UITableViewDelegate。但如果你创建SomeViewControllerUIViewController 的子类)和UITableViewController 协议,然后使用扩展中描述的方法为SomeViewController 创建扩展,它将失败。

以上是关于如何通过 Swift 扩展实现委托方法的主要内容,如果未能解决你的问题,请参考以下文章

通过 Swift 中的不同类调用委托方法

swift UITableView委托扩展Boilerplate

如何使用扩展设置 viewController 搜索栏的委托?

Swift:如何使用 UISwitch 控制 UITextField 通过委托启用或禁用

Swift使用委托实现多个协议

如何在 Swift 中转换 Objective-C TOCropViewController 委托方法?