【问题标题】:Abstract class in SwiftSwift 中的抽象类
【发布时间】:2017-02-01 23:18:42
【问题描述】:

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

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

我实际上想做的是:

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

但我无法用 Swift 来模拟这一点(我认为)。协议不能从类继承,也没有动态调度,这扼杀了我对所有东西都可以覆盖的想法。

有人知道怎么做吗?可能是工厂?我想尽可能简单地实现一个新的 collectionView。

【问题讨论】:

  • Swift 没有抽象类。和 IMO 它不需要它们。借助泛型和协议——尤其是 协议扩展——swift 提供了丰富的工具集。
  • @vikingosegundo 你对我的问题有具体的解决方案吗?我不是要求更改语言,我想尽可能地实现这一点。
  • 因为你的具体例子:你可能看看我最近开始的一个项目:TaCoPopulator,一个用于集合和表格视图的数据源框架。
  • 老实说,我不明白你在这里想说什么:协议不能从类继承,也没有动态调度,这扼杀了我对所有东西都可以覆盖的想法。我>
  • @vikingosegundo 我希望我的所有方法都可以在具体类中被覆盖,但是如果没有动态调度,就无法通过使用协议扩展来做到这一点。另外,我不能让我的协议继承自UICollectionViewCell,我必须同时实现UICollectionViewCell 和我的协议并不断使用as! 来使用它们,这并不好。这些事情在具有抽象类的语言中是可能的,例如 Java 和 C#。我只是想知道在 Swift 中最好的方法是什么。

标签: swift oop inheritance uicollectionview


【解决方案1】:

供参考,add Abstract classes/methods 有一个提案,但目前有所不同。我猜他们会在未来一两年内重新审视它。

我完成这类事情的方法是使用具有关联类型的协议:

protocol ViewModelUpdatable {
    associatedtype ViewModelType
    func update(with viewModel: ViewModelType)
}

然后简单地让你的班级遵守它,它会迫使你添加:

func update(with viewModel: WhateverTypeYouWant) {
    //update your class
}

这种方法的优点是可以以更通用的方式处理类,但保持类型安全。

我希望有一天能用泛型来处理这个问题,但 InterfaceBuilder 仍然与泛型不符 ?。

【讨论】:

    【解决方案2】:

    嗯,不太确定你想要什么。看看下面的协议。

    protocol SetDataViewCell {}
    
    extension SetDataViewCell where Self: UICollectionViewCell {
        func setData(_ data: AnyObject) {}
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 2014-07-29
      • 1970-01-01
      • 2016-03-12
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多