在 swift 中无法访问泛型结构的 decoadable 中的嵌套值?
It is impossible to access the nested value in decoadable of generic type of struct in swift?
我想知道如果我将数据从 api 解码为通用类型的模型 class,我是否可以访问通用类型的嵌套值。
抱歉英语不好。
GeneralResponse.swift - class 将数据映射到对象有数据 class 是通用类型
struct GeneralResponse<T: Decodable>: Decodable {
var code: String
var dataResponse : T
}
Model.swift - dataResponse 字段中地图的模型 class。
struct Model: Decodable {
var name: String
var lname: String
}
APIManager.swift - 将数据从 api 映射到对象(模型的发送类型)
var myStruct = try! JSONDecoder().decode(GeneralResponse<T>.self, from: jsonData)
ViewController.swift - 在 APIManager
中调用一个方法
APIManager.callRequest(url: "someURL", type: Model.self)
在这种情况下,我想访问 "name" 或 "lname" 但它不能。
您可以执行以下操作:
do {
let myStruct = try JSONDecoder().decode(GeneralResponse<Model>.self, from: jsonData)
print(myStruct.dataResponse.name)
print(myStruct.dataResponse.lname)
} catch {
print("error: \(error)")
}
请参考以下代码
APIManager.swift
func callRequest<T:Decodable>(url: String,modelClass:T.Type,SuccessBlock:@escaping (T) -> Void){
do {
var myStruct = try JSONDecoder().decode(GeneralResponse<T>.self, from: Data())
SuccessBlock(myStruct.dataResponse)
} catch let error {
print(error)
}
}
ViewController.swift
callRequest(url:"someURL",modelClass: Model.self, SuccessBlock: { (response) in
print(response.lname,response.name)
})
我想知道如果我将数据从 api 解码为通用类型的模型 class,我是否可以访问通用类型的嵌套值。 抱歉英语不好。
GeneralResponse.swift - class 将数据映射到对象有数据 class 是通用类型
struct GeneralResponse<T: Decodable>: Decodable {
var code: String
var dataResponse : T
}
Model.swift - dataResponse 字段中地图的模型 class。
struct Model: Decodable {
var name: String
var lname: String
}
APIManager.swift - 将数据从 api 映射到对象(模型的发送类型)
var myStruct = try! JSONDecoder().decode(GeneralResponse<T>.self, from: jsonData)
ViewController.swift - 在 APIManager
中调用一个方法APIManager.callRequest(url: "someURL", type: Model.self)
在这种情况下,我想访问 "name" 或 "lname" 但它不能。
您可以执行以下操作:
do {
let myStruct = try JSONDecoder().decode(GeneralResponse<Model>.self, from: jsonData)
print(myStruct.dataResponse.name)
print(myStruct.dataResponse.lname)
} catch {
print("error: \(error)")
}
请参考以下代码
APIManager.swift
func callRequest<T:Decodable>(url: String,modelClass:T.Type,SuccessBlock:@escaping (T) -> Void){
do {
var myStruct = try JSONDecoder().decode(GeneralResponse<T>.self, from: Data())
SuccessBlock(myStruct.dataResponse)
} catch let error {
print(error)
}
}
ViewController.swift
callRequest(url:"someURL",modelClass: Model.self, SuccessBlock: { (response) in
print(response.lname,response.name)
})