我需要向 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/