我有以下课程:
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] 删除。
我来说两句