Swift中的协议扩展?

时间:2014-11-07 15:36:32

标签: swift ios8 uicollectionview

我需要向UICollectionViewDataSource添加一些行为。

如果我要创建一个Collection View扩展,我会这样做:

extension UICollectionView
{
  func thisWorks() {}
}

但是尝试为数据源执行此操作会导致"协议' UICollectionViewDataSource'不能延长"错误。

extension UICollectionViewDataSource
{
  func thisDoesntWork() {}
}

有没有办法在协议中添加新的功能?

2 个答案:

答案 0 :(得分:2)

Extensions中所述:

  

扩展程序为现有的类,结构或枚举类型添加新功能

因此扩展协议可能 - 它们支持继承,这意味着您可以对协议进行子类化。

但是,我认为协议扩展没有多大意义。如果扩展UICollectionViewDataSource,则意味着所有采用它的类都将无法编译,因为扩展设置了新的需求 - 包括U UICollectionViewController等UIKit类,它本身实现UICollectionViewDataSource

在您的情况下,我认为有两种解决方案:

  • 创建一个继承自UICollectionViewDataSource
  • 的新协议
  • 创建一个单独的协议,但未链接到UICollectionViewDataSource(但很可能具有相似的名称)

我会选择选项号。 2,因为前者通过在类声明中隐藏UICollectionViewDataSource名称而使代码的可读性降低。

答案 1 :(得分:1)

简而言之,没有。而且你不需要 - 任何期望与UICollectionViewDataSource一起工作的东西只能期待特定的方法。只需声明自己的自定义协议,符合该协议,然后在适当的类中使用它:

extension MyCustomCollectionViewDataSource {
    func thisWorks() {}
}