gpt4 book ai didi

ios - 类型 '[T]'(数组类型)不符合协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 00:40:11 24 4
gpt4 key购买 nike

让我用例子来解释这个问题。

我有两个协议(protocol),名为 - Mappable(在 Git 上可用)和 Responsable(我创建了符合 Mappable 协议(protocol)的协议(protocol))

protocol Responsable: Mappable {
static func getResponse(map: Map) -> Self
}

方法一然后我有结构'NSIResponse',它是通用的并且符合 Mappable 和通用 T 是 Resposable 类型

struct NSIResponse<T>: Mappable where T: Responsable {
mutating func mapping(map: Map) {
response = T.getResponse(map: map)
}
}

之后,我创建了符合 Responsable 协议(protocol)的用户对象结构。

struct User: Responsable {

var id: Int ?
mutating func mapping(map: Map) {
id <- map["id"]
}
static func getResponse(map: Map) -> User {
guard let response = Mapper <User>().map(JSONObject: map["response"].currentValue)
else {
return User()
}
return response
}
}

方法 2好吧,我创建了 getResponse 或 Responsable,因为我不想在 NSIResponse 的映射方法中使用更多行,如下所示

 mutating func mapping(map: Map) {
switch T.self {
case is User.Type: response = Mapper<User>().map(JSONObject: map["response"].currentValue) as? T
case is Array<User>.Type: response = Mapper<User>().mapArray(JSONObject: map["response"].currentValue) as? T
default: response <- map["response"]
}
}

我不想使用以前的方法,因为如果我这样做,那么我必须为每个类编写每两行代码。结果,函数长度会增加。因此,我创建了 T.getResponse(map: map) 方法。

现在我面临的问题

let jsonResponse = response.result.value as? [String: AnyObject]
let nsiResponse = NSIResponse<User>(JSON: jsonResponse) // WORKING
let nsiResponse1 = NSIResponse<[User]>(JSON: jsonResponse) // NOT WORKING and getting Type '[User]' does not conform to protocol Responsable

但是,它在方法 2 的情况下工作正常..如果您能帮助我解决方法 1,我将不胜感激。

希望您理解我的问题。

最佳答案

这个错误的原因是因为类型Array不符合Responsable,只有User符合。在方法 2 中,您涵盖了该案例,因此它有效。

您要做的是扩展Array 类型,使其符合Responsable:

extension Array: Responsable {
mutating func mapping(map: Map) {
// Logic
}

static func getResponse(map: Map) -> User {
// Logic
}
}

关于ios - 类型 '[T]'(数组类型)不符合协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com