如何通过 Swift 扩展实现委托方法
Posted
技术标签:
【中文标题】如何通过 Swift 扩展实现委托方法【英文标题】:How do I implement delegate methods through Swift extension 【发布时间】:2016-05-25 07:46:33 【问题描述】:我的项目是 Obj-C 和 Swift 的混合体,我正在尝试使用 Swift 扩展我的 AppDelegate 类。
所以现在我有AppDelegate.m
、AppDelegate.h
和AppDelegate.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
。但如果你创建SomeViewController
(UIViewController
的子类)和UITableViewController
协议,然后使用扩展中描述的方法为SomeViewController
创建扩展,它将失败。以上是关于如何通过 Swift 扩展实现委托方法的主要内容,如果未能解决你的问题,请参考以下文章
swift UITableView委托扩展Boilerplate
如何使用扩展设置 viewController 搜索栏的委托?