【问题标题】:Can you extend a protocol that inherits from another protocol?您可以扩展从另一个协议继承的协议吗?
【发布时间】:2015-07-03 11:34:33
【问题描述】:

我想创建一个从UICollectionViewDataSource 继承的协议,并使用协议扩展来提供所需UICollectionViewDataSource 方法的默认实现。但是,当我尝试声明一个符合此协议的类时,编译器会显示Type 'MyClass' does not conform to protocol UICollectionViewDataSource'

protocol MyDataSource : UICollectionViewDataSource {
    var values: [String] { get }
}

extension MyDataSource {
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = UICollectionViewCell() // TODO: dequeue
        // TODO: configure cell ...
        return cell
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.values.count
    }
}

class MyClass : NSObject, MyDataSource {
    var values = [String]()
}

我也尝试将扩展声明如下,但仍然收到相同的编译器错误:

extension UICollectionViewDataSource where Self : MyDataSource

我什至尝试将其扩展到所有 UICollectionViewDataSources 以查看仅继承部分是否可以工作,但没有骰子——同样的错误。

extension UICollectionViewDataSource

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    不幸的是,您尝试做的事情是不可能的。问题是这是一个 Objective-C 协议。 Objective-C 从未听说过协议扩展。因此它不知道这个协议扩展正在向 MyClass 注入两个函数。它看不到它们,就它而言,不满足协议要求。

    【讨论】:

    • 我不明白为什么子类化不好。这正是我要建议的。在协议扩展出现之前,我们就是这样继承了数百年的通用功能,这对我们来说已经足够好了!
    • 我已经为它们找到了一些很好的用途。当然,他们彻底改变了标准库的结构。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2019-10-29
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多