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

Swift嵌套泛型类型不符合协议,swift,generics,nested-generics,Swift,Generics,Nested Generics,我有一个响应类包含一个值,还有一个值类包含符合可映射协议的数据 现在我有了一个处理响应对象的函数,但当我试图从Value对象中获取数据时,它显示类型“R”不符合协议 这是我在操场上的代码: 更新 protocol Mappable{ func doSomething() } class User: Mappable { func doSomething() { } } class Book: Mappable { func doSomething() {

我有一个响应类包含一个值,还有一个值类包含符合可映射协议的数据

现在我有了一个处理响应对象的函数,但当我试图从Value对象中获取数据时,它显示类型“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)
})
协议可映射{
func doSomething()
}
类用户:可映射{
func doSomething(){
}
}
教材:可映射{
func doSomething(){
}
}
类值:可映射{
var数据:T?
func doSomething(){
}
}
班级反应{
var值:T?
}
func handleResponse(响应:响应,completeHandler:(R?,n错误?)->()){
completeHandler(response.value!.data,nil)//此处出现错误:类型“R”不符合可映射协议
}
让response=response()
response.value=value()
response.value?.data=User()
让response2=Response()
response2.value=value()
response2.value?.data=Book()
HandlerResponse(响应,completeHandler:{(r,e)在
印刷品(r)
})
HandlerResponse(response2,completeHandler:{(r,e)in)
印刷品(r)
})
我做得对吗?或任何其他方式来实现这一点。
谢谢,访问handleResponse()函数中的response.value实际上会使编译器崩溃,这肯定是编译器中的一个错误。我重写了您的代码,因此它可以编译:

import Foundation

protocol Mappable {
    func doSomething()
}

class User: Mappable {
    func doSomething() {

    }
}

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

    func doSomething() {

    }
}

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

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


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


handleResponse(response, completeHandler:{(r,e) in
    print(r)
})
<代码>导入基础 协议可映射{ func doSomething() } 类用户:可映射{ func doSomething(){ } } 类值:可映射{ var数据:T? func doSomething(){ } } 班级反应{ var值:T? } func handleResponse(响应:响应,completeHandler:(用户?、NSError?->()) { completeHandler(response.value!.data,nil) } 让response=response() response.value=value() response.value?.data=User() HandlerResponse(响应,completeHandler:{(r,e)在 印刷品(r) })
我不太清楚为什么你的代码不起作用。我想这是因为斯威夫特很难在泛型中推断出泛型的类型

我通过包装
响应
类型本身,而不是为
定义一个新的泛型,成功地将其编译。例如:

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

我很想知道是否有其他人确切地知道为什么您的原始代码不能工作

谢谢你的回复。实际上,我想做的是让HandlerResponse能够处理任何可映射的数据,我已经更新了我的代码,希望这能告诉我更多我想要实现的东西。是的,像这样定义函数会起作用。谢谢。我怀疑在编译时,它实际上不知道我的泛型R符合协议,所以当我访问泛型t中的数据时,它假设我的R只是一个AnyObject。