swift - Swift 中的抽象类

标签 swift oop inheritance uicollectionview

我知道协议(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/

相关文章:

xcode - 如何在没有 Xcode IDE 的情况下使用 Swift 进行开发

swift - Tableview 原型(prototype)单元高于其他单元

python - 在类内访问 `__attr` 时,名称修改如何工作?

c++ - 创建一个包含其父类的所有功能的类,除了一个

java - 扩展内部接口(interface)?

javascript - util继承于node

ios - map View 未显示位置

ios - Swift:如何从我的应用程序打开本地 pdf 到 iBooks

php - 基于字符串动态创建 PHP 对象

Python - 类和 OOP 基础