我知道协议和协议扩展是模拟抽象类的最佳方式,但我想要做的事情需要真正的抽象类。
我想要BaseCollectionViewCell
和BaseCollectionViewSource
一起工作。您将数组传递给BaseCollectionViewSource
的子类,并实现一个返回重用标识符的方法。该单元格将由BaseCollectionViewSource
实例化,并且具有可在具体collectionViewCell中覆盖的方法setData
。
我实际想做的是:
abstract class WRBaseCollectionViewCell: UICollectionViewCell {
abstract func setData(_ data: AnyObject)
}
但是我无法用Swift来模仿这个(我想)。协议不能从类继承而且没有动态调度,这会使我的想法成为可以覆盖的一切。
有谁知道如何做到这一点?可能是工厂?我想尽可能简单地实现一个新的collectionView。
答案 0 :(得分:4)
作为参考,有add Abstract classes/methods的提案,但目前有所不同。我猜他们将在未来一两年内重新审视它。
我完成此类事情的方法是使用具有相关类型的协议:
protocol ViewModelUpdatable {
associatedtype ViewModelType
func update(with viewModel: ViewModelType)
}
然后只需让你的课程遵守它,它就会强迫你添加:
func update(with viewModel: WhateverTypeYouWant) {
//update your class
}
这种方法的优点是,可以以更通用的方式处理类,但保持类型安全。
我希望有一天能够处理这个问题的方式是泛型,但InterfaceBuilder仍然打破了泛型。
答案 1 :(得分:1)
protocol SetDataViewCell {}
extension SetDataViewCell where Self: UICollectionViewCell {
func setData(_ data: AnyObject) {}
}