我知道协议(protocol)和协议(protocol)扩展是模拟抽象类的最佳方式,但我认为我想做的事情需要真正的抽象类。
我想要一个 BaseCollectionViewCell
和一个 BaseCollectionViewSource
一起工作。您会将一个数组传递给 BaseCollectionViewSource
的子类,并实现一个返回重用标识符的方法。该单元格将由 BaseCollectionViewSource
实例化,并具有一个方法 setData
,该方法将在具体的 collectionViewCell 中被覆盖。
我实际上想做的是:
abstract class WRBaseCollectionViewCell: UICollectionViewCell {
abstract func setData(_ data: AnyObject)
}
但我无法用 Swift 模拟这一点(我认为)。协议(protocol)不能从类继承,也没有动态调度,这扼杀了我对一切都可以覆盖的想法。
有没有人知道如何做到这一点?也许是工厂?我想让它尽可能简单地实现一个新的 collectionView。
最佳答案
作为引用,有提案给add Abstract classes/methods但目前有所不同。我猜他们会在未来一两年内重新审查它。
我完成这类事情的方法是使用关联类型的协议(protocol):
protocol ViewModelUpdatable {
associatedtype ViewModelType
func update(with viewModel: ViewModelType)
}
然后简单地让你的类(class)遵守它,它会迫使你添加:
func update(with viewModel: WhateverTypeYouWant) {
//update your class
}
这种方法的优点是可以以更通用的方式处理类,同时保持类型安全。
我希望有一天能用泛型来处理这个问题,但 InterfaceBuilder 仍然与泛型决裂😭。
关于swift - Swift 中的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41991643/