我有一个 MyClass 类实现委托 Collection_Delegate 的通用函数。
我的课程集合和项目是某些特定课程的超类
protocol Collection_Delegate {
func onFetchAllCompleted<T, U where T: Collection<U>, U: Item>(collection: T, error: String?)
}
class Collection<T>: Item {
private var items: [T]
override init (communicator: CG_API_Communicator) {
items = [T]()
super.init(communicator: communicator)
}
internal func fetchAll() {
fatalError(notImplemented)
}
internal func onFetchAllCompleted(error: String?, json: JSON?) {
fatalError(notImplemented)
}
internal func appendItem(item: T) {
self.items.append(item)
}
internal func getItems() -> [T] {
return self.items
}
}
class Item {
var itemDataRaw: JSON?
func toString() -> String? {
var retval: String?
if let value: String = itemDataRaw?.rawString(encoding: NSUTF8StringEncoding) {
retval = value
} else {
retval = "Something went badly wrong"
}
return retval
}
}
现在在集合的一些子类中,我想调用委托avery子类的泛型onFetAllCompleted函数。但实现 Collection_Delegate 协议导致编译器错误的类
class MyClass: Collection_Delegate { // Error
func onFetchAllCompleted<T, U where T: Collection<U>, U: Item>(collection: T, error: String?){
println("MyClass.onFetchAllCompleted:\(_stdlib_getTypeName(collection))") // This displays the right class name of the subclasses
let item: Item = collection.getItems()[0] //Error
let string = item.toString()
}
}
我们走了。类** MyClass *得到错误
输入&#34; MyClass&#34;不符合协议&#34; Collection_Delegate&#34;
在泛型函数中,我得到了错误
&#39; U&#39;不能转换为&#39;项目&#39;
那么我做错了什么?为什么通用的东西不起作用?
答案 0 :(得分:1)
我认为你的泛型函数声明有点复杂。如果我理解正确你的onFetchAllCompleted函数接受参数T,它是U的集合,U是一个Item。如果这是正确的,上面的表达式可以像这样简化:onFetchAllCompleted函数接受参数T,即项目集合。所以你的协议和类应该是这样的
protocol Collection_Delegate {
func onFetchAllCompleted<T: Collection<Item>>(collection: T, error: String?)
}
class MyClass: Collection_Delegate {
func onFetchAllCompleted<T: Collection<Item>>(collection: T, error: String?){
println("MyClass.onFetchAllCompleted:\(_stdlib_getTypeName(collection))") // This displays the right class name of the subclasses
let item: Item = collection.getItems()[0] //Error
let string = item.toString()
}
}
如果这有助于你,请告诉我