Swift嵌套泛型类型不符合协议

时间:2016-04-20 16:51:46

标签: swift generics nested-generics

我有一个Response类包含一个值,我还有一个Value类包含符合Mappable协议的数据。

现在我有一个处理Response对象的函数,但是当我尝试从Value对象中获取数据时,它显示Type" R"不符合协议。

这是我在游乐场的代码:

更新

protocol Mappable{
    func doSomething()
}

class User: Mappable {
    func doSomething() {

    }
}

class Book: Mappable {
    func doSomething() {

    }
}

class Value<T: Mappable>: Mappable{
    var data: T?

    func doSomething() {

    }
}

class Response<T>{
    var value: T?
}

func handleResponse< R: Mappable, T:Value<R>>(response:Response<T>, completeHandler: (R?, NSError?)->()){
    completeHandler(response.value!.data, nil)  //error goes here: Type "R" does not conform to protocol Mappable

}


let response = Response<Value<User>>()
response.value = Value<User>()
response.value?.data = User()

let response2 = Response<Value<Book>>()
response2.value = Value<Book>()
response2.value?.data = Book()

handleResponse(response, completeHandler:{(r,e)in
    print(r)
})

handleResponse(response2, completeHandler:{(r,e)in
    print(r)
})

我做得对吗?或任何其他方式来实现这一目标。 感谢

2 个答案:

答案 0 :(得分:2)

我不确定为什么你的代码不起作用。我认为这是因为Swift很难推断泛型中泛型的类型。

我设法通过包装response类型本身来编译它,而不是为Value<R>定义新的泛型。例如:

func handleResponse<R: Mappable>(response:Response<Value<R>>, completeHandler: (R?, NSError?)->()){
    completeHandler(response.value!.data, nil)
}

我很想知道是否有其他人确切知道为什么原始代码不起作用!

答案 1 :(得分:0)

嘿,访问handleResponse()中的response.value - 函数实际上会使编译器崩溃,这肯定是编译器中的一个错误。我重写了你的代码,所以编译:

<div id="container">
<div class="image">
<img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRFiBE-kc80qZxHO5H7qTc__JvAFpi54QcV8O5qagA8RcRA6661Ag" />
</div>
<ul>
<li>Example</li>
<li>Example</li>
</ul>
</div>