你能扩展一个继承自另一个协议的协议吗?

时间:2015-07-03 03:15:10

标签: ios swift

我想创建一个继承自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

1 个答案:

答案 0 :(得分:5)

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