如何在swift中使用单个Model显示不同形式的数据



我有一个api请求函数如下

func getUsers(completion:@escaping (Result<[ResultItem],NetworkError>) -> ()) {
var uri = "";
if(withID != ""){
uri = "testwithID"
}

else {
uri = "test"
}

let method = GET
let urlString = "https:myownURL(uri)"

//generates a header
let urlHeader=headersGenerator()
URLSession.shared.dataTask(with: urlHeader) { [self] (data, response , error) in
guard let data = data else { return }
print(String(data: data, encoding: .utf8) ?? "Invalid JSON")
do {
let results = try JSONDecoder().decode(Results.self,from: data)

completion(.success(results.userInfo))
} catch {
print("Error:(error)")

}
}.resume()
}

模型如下

struct Results: Codable {
let userInfo:[ResultItem]
}
struct ResultItem: Codable, Identifiable {
let id = UUID()
let userId: String
var userlastname:String
var username:String
}

这是给我一个适当的响应如下,当我不传递withID(url将是https:myownURL。测试)

输出如下

{"userInfo":[{"userId":"0390","userlastname":"test1","username":"test1"},{"userId":"0391","userlastname":"test2","username":"test2"},{"userId":"0392","userlastname":"test3","username":"test3"}]}

但是如果我用withID运行url(url将是https:myownURL.test。withID)输出应该给出单个值,我得到的是单个值,但格式不同

{"userId":"0390","userlastname":"test1","username":"test1"}

但是两个API的模型是相同的,所以它应该返回如下的响应

{"userInfo":[{"userId":"0390","userlastname":"test1","username":"test1"}]}

请让我知道我做错了什么,这样回复会是这样的

{"userInfo":[{"userId":"0390","userlastname":"test1","username":"test1"}]}

我已经提供了完整的参考代码,我正在使用适当的URL和数据,请帮助我这个

当你告诉API你想用withID变量得到什么结果时,你可以有条件地解码数据。

如果出现错误,建议调用completionfailure

func getUsers(completion: @escaping (Result<[ResultItem],Error>) -> ()) {
var uri = "test"
if !withID.isEmpty {
uri += "withID"
} 

let method = GET
let urlString = "https:myownURL(uri)"

//generates a header
let urlHeader = headersGenerator()

URLSession.shared.dataTask(with: urlHeader) { (data, _ , error) in
if let error { completion(.failure(error)); return }
print(String(data: data!, encoding: .utf8) ?? "Invalid JSON")
do {
if !withID.isEmpty {
let results = try JSONDecoder().decode(ResultItem.self,from: data!)
completion(.success([results]))
} else {
let results = try JSONDecoder().decode(Results.self,from: data!)
completion(.success(results.userInfo))
}
} catch {
completion(.failure(error))
}
}.resume()
}

最新更新