Skip to main content
 首页 » 操作系统

swift之Swift 中的协议(protocol)扩展

2024年01月01日40tintown

我需要向 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 名称来降低代码的可读性。