协议相关类型和泛型

时间:2016-03-31 10:18:30

标签: ios generics swift2

我的代码如下所示:

protocol Remotable {
    init?(dict: Dictionary<String, String>)
}

protocol SearchResultable {
    associatedtype TRS: Remotable
    static func myFunction(remote: TRS)
}

struct MySearchResult<T:SearchResultable, TR: Remotable> {
    typealias TRS = TR
    let items: Array<T>
    let limit: Int

    func testMethod() {
        let dict = [["id": "asd123"],["id":"asd456"]]
        let a = dict.flatMap(TRS.init)
        let b = a[0] //has type TR
        let c = T.myFunction(... //expects an argument of type T.TRS
    }
}

我无法调用myFunction,因为它需要一个T.TRS类型的参数。我期待我可以使用TR类型的b参数调用myFunction。你知道我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

我也找到了自己问题的答案。我不知道哪一个更好,如果有人能解释哪个更好以及为什么,我将不胜感激。

struct MySearchResult<T:SearchResultable, TR where T.TRS == TR > {
    let items: Array<T>
    let limit: Int

    func testMethod() {
        let dict = [["id": "asd123"],["id":"asd456"]]
        let a = dict.flatMap(TR.init)
        let b = a[0]
        let c = T.myFunction(b)
    }
}

所以我只需告诉编译器T.TRS与TR相同。

答案 1 :(得分:0)

尝试强制解包a[0],因为函数需要T.TRS类型的参数,您确信a[0]符合协议Remotable

let c = a[0] as! T.TRS
T.myFunction(c)