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

时间:2017-07-14 12:34:52

标签: ios iphone swift generics swift3

让我以示例解释这个问题。

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

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协议的User Object结构。

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帮助我,我将非常感激。

我希望你理解我的问题。

1 个答案:

答案 0 :(得分:4)

此错误的原因是因为Array类型不符合Responsable,只有User符合Array。在方法2中,您将覆盖该案例,以便它起作用。

您需要做的是扩展Responsable类型,以便它符合extension Array: Responsable { mutating func mapping(map: Map) { // Logic } static func getResponse(map: Map) -> User { // Logic } }

self.mydsn = cx_Oracle.makedsn(self.parser.get(
    'oracle', 'db'),
    self.parser.get('oracle', 'port'),
    self.parser.get('oracle', 'service_name')
    )