Swift中的抽象类

时间:2017-02-01 23:18:42

标签: swift oop inheritance uicollectionview

我知道协议和协议扩展是模拟抽象类的最佳方式,但我想要做的事情需要真正的抽象类。

我想要BaseCollectionViewCellBaseCollectionViewSource一起工作。您将数组传递给BaseCollectionViewSource的子类,并实现一个返回重用标识符的方法。该单元格将由BaseCollectionViewSource实例化,并且具有可在具体collectionViewCell中覆盖的方法setData

我实际想做的是:

abstract class WRBaseCollectionViewCell: UICollectionViewCell {
    abstract func setData(_ data: AnyObject)
}

但是我无法用Swift来模仿这个(我想)。协议不能从类继承而且没有动态调度,这会使我的想法成为可以覆盖的一切。

有谁知道如何做到这一点?可能是工厂?我想尽可能简单地实现一个新的collectionView。

2 个答案:

答案 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) {}
}