类型“MyClass”不符合协议“Collection_Delegate”

时间:2015-03-04 09:10:35

标签: ios swift generics

我有一个 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;

那么我做错了什么?为什么通用的东西不起作用?

1 个答案:

答案 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()
    }
}

如果这有助于你,请告诉我