我的应用程序基础架构中有 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
}
假设我有一个符合Codable
的Person
类
class Person : Codable {
var name:String?
}
现在我需要像这样将类型分配给请求中(以一种丑陋的方式到达这里(
let request = NetworkingRequest()
request.objectClass = Person.self
现在,当我希望NetworkingManager
解码响应时,我像这样使用它:
JSONDecoder().decode(type:request.objectClass, data:dataFromService)
问题是当我这样做时,我收到此错误:
无法使用类型(Decodable.Type,from:Data(的参数列表调用解码。需要类型(T.Type,来自:数据(的参数列表。
任何帮助将不胜感激
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)
}
尝试这样的事情:
class NetworkRequest<T: Codable> {
var objectClass: T.Type
init(objectClass: T.Type) {
self.objectClass = objectClass
}
}
将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)