Swift 嵌套泛型类型不符合协议
Swift nested generics type does not conform to protocol
我有一个 Response class 包含一个值,我还有一个 Value class 包含符合 Mappable 协议的数据。
现在我有一个函数来处理 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)
})
我做的对吗?或任何其他方式来实现这一目标。
谢谢
嘿,在 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)
})
我不太确定为什么您的代码不起作用。我认为这是因为 Swift 难以推断泛型中泛型的类型。
我设法通过包装 response
类型本身来编译它,而不是为 Value<R>
定义一个新的泛型。例如:
func handleResponse<R: Mappable>(response:Response<Value<R>>, completeHandler: (R?, NSError?)->()){
completeHandler(response.value!.data, nil)
}
我很想知道是否还有其他人确切知道为什么您的原始代码不起作用!
我有一个 Response class 包含一个值,我还有一个 Value class 包含符合 Mappable 协议的数据。
现在我有一个函数来处理 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)
})
我做的对吗?或任何其他方式来实现这一目标。 谢谢
嘿,在 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)
})
我不太确定为什么您的代码不起作用。我认为这是因为 Swift 难以推断泛型中泛型的类型。
我设法通过包装 response
类型本身来编译它,而不是为 Value<R>
定义一个新的泛型。例如:
func handleResponse<R: Mappable>(response:Response<Value<R>>, completeHandler: (R?, NSError?)->()){
completeHandler(response.value!.data, nil)
}
我很想知道是否还有其他人确切知道为什么您的原始代码不起作用!