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

标签 ios iphone swift generics swift3

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

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

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

方法 1 然后我有结构“NSIResponse”,它是通用的,符合 Mappable 和通用 T 是 Resposable 类型

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

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

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/

相关文章:

ios - 如何在swift 4中的 subview 中填充背景图像?

iphone - 从相机中剪下预定义的照片

javascript - 将某些 CSS 应用于指定大小的图像

ios - 从 Appdelegate 到 Viewcontrollers

ios - 以编程方式将自定义类名称设置为 Storyboard

ios - UIView 的 shadowpath 颜色没有改变

iphone - 使用 CLLocationManager 时查找速度时出现问题

iphone - IOS5 setBrightness 不适用于 applicationWillResignActive

ios - 提供固定宽度约束的替代标签可能会导致剪切警告,为什么?

ios - 当 inputAccessoryView 出现时,将 Collection View 聊天向上移动