0

我的应用程序基础架构中有 2 个主要部分。

NetworkingManager
NetworkRequest

我的目标是让请求保持不变,Codable Type以便在网络完成后,该Manager层可以使用正确的类型实例化新实例

decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

所以我NetworkRequest看起来像这样

class NetworkRequest {
  var objectClass:Codable.Type
}

可以说我有一个Person符合的课程Codable

class Person : Codable {
 var name:String?
}

现在我需要像这样将类型分配给请求(以一种丑陋的方式到达这里的重点)

let request = NetworkingRequest()
request.objectClass = Person.self

现在,当我想要NetworkingManager解码响应时,我会像这样使用它:

JSONDecoder().decode(type:request.objectClass, data:dataFromService)

问题是当我这样做时,我得到了这个错误:

无法使用类型的参数列表调用解码(Decodable.Type,来自:Data)。需要类型的参数列表(T.Type,来自:Data)。

任何帮助,将不胜感激

4

3 回答 3

1
class NetworkRequest<T: Codable> {
    var objectClass: T.Type!

    init(objectClass : T.Type) {
        self.objectClass = objectClass
    }

}

class Person : Codable {
    var name:String?
}

let request = NetworkRequest<Person>(objectClass: Person.self)

let response : Dictionary<String,Any> = ["name":"test"]
let data : Data = try! JSONSerialization.data(withJSONObject: response,options: [])

do {
    let person = try JSONDecoder().decode(request.objectClass, from: data)
    print(person.name ?? "--")
} catch {
    print(error)
}
于 2018-09-12T07:20:33.343 回答
1

标记NetworkRequest为仿制药是否满足<T: Codeable>您的需求?

class NetworkRequest<T: Codable> {
    var objectClass: T.Type
}

然后初始化并调用

let request = NetworkRequest<Person>()
request.objectClass = Person.self

并打电话

try JSONDecoder().decode(request.objectClass, from: dataFromService)
于 2018-09-12T06:32:30.143 回答
1

尝试这样的事情:

class NetworkRequest<T: Codable> {
    var objectClass: T.Type

    init(objectClass: T.Type) {
        self.objectClass = objectClass
    }
}
于 2018-09-12T06:31:11.927 回答