swift - Swift 中的协议(protocol)扩展?

标签 swift ios8 uicollectionview

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

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

extension UICollectionView
{
  func thisWorks() {}
}

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

extension UICollectionViewDataSource
{
  func thisDoesntWork() {}
}

有没有办法向协议(protocol)添加新功能?

最佳答案

Extensions 中所述:

Extensions add new functionality to an existing class, structure, or enumeration type

因此扩展协议(protocol)是不可能的——它们支持继承,这意味着您可以子类化协议(protocol)。

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

对于您的情况,我认为有 2 种解决方案:

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

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

关于swift - Swift 中的协议(protocol)扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804703/

相关文章:

swift - 试图将数据从 UICollectionViewCell 传递到 UIViewController

ios - 类型与 Alamofire 不符合协议(protocol) 'URLRequestConvertible'

ios - 检测 "Allow Notifications"是否为 iOS8 打开/关闭

ios - UICollectionViewFlowLayout Voice Over 使用流布局读取无序的项目

ios - Swift 无法使用类型为 '==' 的参数调用 '(Int @lvalue [Int])'

swift - Xcode 6.1 Swift 问题 - 'init()' 不可用 : superseded by import of -[NSObject init]

ios - 如何在 Swift 3 中多次触摸 UICollectionViewCells

ios - 在 MVVM 和 RxSwift 中围绕 ViewController 传递数据

swift - 检测事件的 NSSplitViewItem

ios - Swift:PrepareForSegue,Swift Cast 失败