好的,我们有UIScrollView
声明:
protocol UIScrollViewDelegate: NSObjectProtocol { ... }
class UIScrollView: UIView {
...
weak var delegate: UIScrollViewDelegate?
...
}
然后UITableView
使用delegate
变种?
protocol UITableViewDelegate: NSObjectProtocol, UIScrollViewDelegate { ... }
class UITableView: UIScrollView {
...
weak var delegate: UITableViewDelegate?
...
}
Apple是如何做到的?当我做我的
protocol MyScrollViewSubclassDelegate: NSObjectProtocol, UIScrollViewDelegate { ... }
class MyScrollViewSubclass: UIScrollView {
...
weak var delegate: MyScrollViewSubclassDelegate?
...
}
我的属性'委托'的类型为'MyScrollViewSubclassDelegate?'不能覆盖类型为“UIScrollViewDelegate?”的属性。
答案 0 :(得分:3)
我偶然发现了几次,我找到的唯一解决方法就是将我的财产称为customDelegate或其他任何你喜欢的东西。
确实可以称之为委托但是嘿,这将是非常好的!
答案 1 :(得分:2)
MyScrollViewSubclass具有UIScrollView的委托属性,因为它是UIScrollView的子类。
由于delegate
已由UIScrollView定义,因此无法使用新类型定义相同的属性名称。
将变量名称delegate
更改为myDelegate
(或其他内容),它应该有效。
答案 2 :(得分:0)
我得到了这个工作,但我不太喜欢这个解决方案,因为它抛弃了类型检查。
我做的是这个。在我的基类中,我将委托声明为
weak var delegate: AnyObject? = nil
然后,当我想在委托上调用方法时,我做
if let delegate = self.delegate as? MyBaseClassProtocol { delegate.myMethod() }
在我的子类中,我也可以做同样的事情
if let delegate = self.delegate as MySubclassProtocol { delegate.mySubclassMethod() }
正如我所说,它有效,但我不喜欢它。在我看来,抛弃类型测试是不能轻易做到的。我只是分享,希望有更强的Swift技能的人可以改进它,或者纠正它。