Swift中的通用类继承

安德烈·戈尔捷夫(Andrey Gordeev)

我有以下课程:

class BaseCache<T: Equatable>: NSObject {

    var allEntities = [T]()

    // MARK: - Append

    func appendEntities(newEntities: [T]) {
        ....
    }
}

现在,我想对其进行子类化,但是会出现一个令人讨厌的错误,即我的类型“不符合协议'Equatable'”: 在此处输入图片说明

Swift中的泛型似乎是真正的痛处。

拉西

您对的类定义TrackingCache是错误的。它重复通用参数:

class TrackingCache<AftershipTracking>: BaseCache<AftershipTracking> { }

它应该被忽略:

class TrackingCache: BaseCache<AftershipTracking> { }

这会触发潜在的迅速错误Classes derived from generic classes must also be generic您可以通过指定为AftershipTracking或从AftershipTracking继承的类型参数来解决此问题:

class TrackingCache<T: AftershipTracking>: BaseCache<AftershipTracking> { }

完整示例:

class BaseCache<T: Equatable>: NSObject {
  var items: [T] = []

  func appendItems( items: [T]) {
    self.items += items
    didAppendItems()
  }

  func didAppendItems() {} // for overriding
}

class AftershipTracking: NSObject {
  var identifier: Int
  init( identifier: Int) {
    self.identifier = identifier
    super.init()
  }
}

extension AftershipTracking: Equatable { }

func ==( lhs: AftershipTracking, rhs: AftershipTracking) -> Bool {
  return lhs.identifier == rhs.identifier
}

class TrackingCache<T: AftershipTracking>: BaseCache<AftershipTracking> {
  override func didAppendItems() {
    // do something
  }
}

let a = TrackingCache<AftershipTracking>()
let b = TrackingCache<AftershipTracking>()

a.appendItems( [AftershipTracking( identifier: 1)])
b.appendItems( [AftershipTracking( identifier: 1)])

let result = a.items == b.items // true

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章