【问题标题】:Protocol Extension in Swift?Swift 中的协议扩展?
【发布时间】:2014-11-07 15:36:31
【问题描述】:

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

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

extension UICollectionView
{
  func thisWorks() {}
}

但尝试为数据源执行此操作会导致“无法扩展协议 'UICollectionViewDataSource'”错误。

extension UICollectionViewDataSource
{
  func thisDoesntWork() {}
}

有没有办法向协议中添加新的函数?

【问题讨论】:

  • 这在 Swift 2 中现在是可能的。来自 WWDC 的 Checkout session 408。

标签: swift ios8 uicollectionview


【解决方案1】:

Extensions报道的:

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

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

但是,我认为协议扩展没有多大意义。如果你扩展UICollectionViewDataSource,这意味着所有采用它的类都会因为扩展设置的新要求而无法编译——包括UIKit类,例如UICollectionViewController,它本身实现了UICollectionViewDataSource

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

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

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

【讨论】:

  • 对,我没有意识到添加一个方法会破坏其他类采用它,但它完全有道理。不过,我可能会选择第一个解决方案。第二个不允许我使用将这个新协议扩展为 UICollectionViewDataSources 的类。
  • 好的 - 顺便说一下,我认为您可以将这两个选项结合起来:在您的类中实现 UICollectionViewDataSource并且 在您的新协议中从它继承。有点冗余,但我认为代码更明确
【解决方案2】:

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

extension MyCustomCollectionViewDataSource {
    func thisWorks() {}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多