简体   繁体   English

Swift中的泛型类继承

[英]Generic class inheritance in Swift

I have the following class: 我有以下课程:

class BaseCache<T: Equatable>: NSObject {

    var allEntities = [T]()

    // MARK: - Append

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

Now I want to subclass it, but I get annoying error, that my type "does not conform to protocol 'Equatable'": 现在我想继承它,但是我得到了令人讨厌的错误,我的类型“不符合协议'Equatable'”: 在此输入图像描述

It seems generics in Swift are real pain-in-the-ass. 看起来斯威夫特的仿制药真的很痛苦。

Your class definition of TrackingCache is wrong. 您对TrackingCache类定义是错误的。 It repeats the generic parameter: 它重复通用参数:

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

It should be left out: 应该省略:

class TrackingCache: BaseCache<AftershipTracking> { }

This triggers the underlying swift error Classes derived from generic classes must also be generic . 这会触发底层的swift错误Classes derived from generic classes must also be generic You can work around this issue by specifying a type parameter that is required to be or inherit from AftershipTracking: 您可以通过指定AftershipTracking所需或继承的类型参数来解决此问题:

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

Full example: 完整示例:

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

this should work: < swift 4 > 这应该工作:<swift 4>

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

Another example: 另一个例子:

protocol P {

}

class C: P {

}

class CS: C {

}

class L<T:P> {
    let c: T

    init(_ c: T) {
        self.c = c
    }
}

class LS<T:CS>:L<T> {

}

let i = LS(CS())

i.c

c is CS now. c现在是CS

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM