在Swift中委托不同类型的属性

时间:2015-07-29 15:14:13

标签: swift

好的,我们有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?”的属性

3 个答案:

答案 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技能的人可以改进它,或者纠正它。