我有一个类(Swift)其中含有指向委托的弱引用,如下所示:
import UIKit
@objc public protocol DRSlidingPanelViewControllerDelegate : class {
optional func didSlidePanel(panelHidden : Bool , sender : DRSlidingPanelViewController) -> Void
}
public class DRSlidingPanelViewController: UIViewController {
public weak var delegate : DRSlidingPanelViewControllerDelegate?
///other stuff...
}
现在我创建了一个继承第一个协议的另一个协议的子类,我想修改继承的“delegate”属性。
@objc public protocol DRTableViewControllerDelegate : DRSlidingPanelViewControllerDelegate {
optional func someFunction(sender : DRTableViewController) -> Void
}
public class DRTableViewController: DRSlidingPanelViewController {
// public weak var delegate : DRTableViewControllerDelegate?
}
在子类中重新声明委托(delegate)属性给我加了3个错误,如果我取消注释,则会出现以下错误:
- 类型为'DRTableViewControllerDelegate?'(又名'Optional')的属性'delegate'无法覆盖具有类型为'DRSlidingPanelViewControllerDelegate?'(又名'Optional')的属性
- 具有Objective-C选择器'delegate'的getter与来自超类'DRSlidingPanelViewController'具有相同Objective-C选择器的getter 'delegate'发生冲突
- 具有Objective-C选择器'setDelegate:'的setter与来自超类'DRSlidingPanelViewController'带有相同Objective-C选择器的setter 'delegate'发生冲突
现在我理解这些错误的本质,并且它们是尝试更改委托指针上的“类型”的不同方面。任何人可以给我一个提示如何做到这一点吗?显然可以做到,看看UITableView如何更改从UIScrollView继承的委托指针即可。在objC中,我会得到一个警告,可以用@dynamic消除该警告。 感谢和最好的问候
编辑/添加 谢谢Matt,我看到这个之前的问题,但很遗憾,它已经关闭,而且我个人不会接受它作为最终答案,因为这是一种妥协。
如果我在xCode中右键单击UITableView并“跳转到定义”,我会看到以下内容
@available(iOS 2.0, *)
public class UITableView : UIScrollView, NSCoding {
public init(frame: CGRect, style: UITableViewStyle) // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
public init?(coder aDecoder: NSCoder)
public var style: UITableViewStyle { get }
weak public var dataSource: UITableViewDataSource?
**weak public var delegate: UITableViewDelegate?**
//plenty other stuff..
}
所以我恭敬地建议,肯定有一种方法可以做到这一点。