Swift 嵌套泛型类型不符合协议(protocol)

标签 swift generics nested-generics

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

现在我有一个函数来处理 Response 对象,但是当我尝试从 Value 对象中获取数据时,它显示类型“R”不符合协议(protocol)。

这是我在 Playground 上的代码:

更新

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)
})

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

最佳答案

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

我设法通过包装 response 来编译它键入自身,而不是为 Value<R> 定义一个新的泛型.例如:

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

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

关于Swift 嵌套泛型类型不符合协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750305/

相关文章:

ios - 无法将类型 '[String]' 的值分配给类型 'String?' (Swift)

java - 递归方法中的泛型

IEnumerable<IList<object>> 上的 C# foreach 编译但不应该

Java 获取封闭泛型类型的类常量(Class<T1<T2>> 的实例)

IOS 推送通知在前台 Swift 4.2

ios - 有没有办法在 Swift 中以编程方式获取所有应用的自动布局约束

ios - 使用 Codable 解析 JSON 响应会 swift 出错

Java ArrayList 泛型实现

c# - 检查通用类型

reactjs - 如何从继承类覆盖 React.Component 状态类型?