将Swift协议作为另一个协议函数的参数

时间:2017-11-06 09:39:39

标签: ios swift swift3 protocols

我正在为我的API结果处理创建通用数据结构,在线阅读它我发现最好使用协议和关联类型。这是我到目前为止的实施。

protocol CreateDataCallback {
    associatedtype E
    func onSuccess(e:E) -> Void
    func onFail() -> Void
}

protocol DataSource: class {
    associatedtype T
    func getData<GDC:GetDataCallback>(id:ID, callback:GDC) -> Void 
}

正如您在代码段中看到的,我的getData函数编写不正确。问题是我不知道如何将'associatedtype T'从DataSource协议传递给CreateDataCallback协议的'associatedtype E'。我可以写一个协议DataSource的扩展,但它不会是通用的。这甚至可以在swift中实现(我现在可以在Java中使用),如果可以,请你告诉我如何。 THX

1 个答案:

答案 0 :(得分:1)

我将GDC设为DataSource的关联类型,并且我将GDC符合CreateDataCallBack。那么你不需要关联类型T,你可以参考GDC.E

protocol DataSource: class{
    associatedtype GDC: CreateDataCallback
    func getData(id:GDC.E, callback:GDC) -> Void
}

这是两个协议的一些实现:

class Bar: CreateDataCallback
{
    func onSuccess(e: Int) {
        // code
    }

    func onFail() {
        // code
    }
    typealias E = Int
}

class Foo: DataSource
{
    typealias GDC = Bar // This makes GDC.E a typealias for Int

    func getData(id: Int, callback: Bar) {
        // code
    }
}