2016-04-20 70 views
0

我有一个Response类包含一个值,并且我也有一个Value类包含符合Mappable协议的数据。Swift嵌套泛型类型不符合协议

现在我有一个函数来处理Response对象,但是当我试图从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) 
}) 

我这样做对吗?或者以任何其他方式来实现这一点。 谢谢

回答

2

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

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

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

我想知道是否有其他人知道到底为什么您的原始代码不工作,但!

+0

是的,定义这样的功能将起作用。谢谢。 – desmond0321

+0

我怀疑编译时,它实际上并不知道我的泛型R符合协议,所以当我访问泛型T中的数据时,它假设我的R只是一个AnyObject。 – desmond0321

0

heh,访问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) 
}) 
+0

感谢您的回复。其实我想要做的是让handleResponse能够处理任何Mappable数据,我已经更新了我的代码,希望这可以告诉更多我试图实现的内容。 – desmond0321

相关问题