[英]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.