2015-07-03 90 views
1

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

回答

5

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

+0

我不明白为什么子类化是不好的。这正是我即将提出的建议。这就是我们在协议扩展出现之前做了数百年的通用功能的继承,对我们来说这已经足够了! – matt

+0

我已经找到了一些很棒的用途。当然,它们已经彻底改变了标准库的结构。 – matt