本地文件数据读取和建模
从项目Bundle中获取json文件中数据
源码参考
我们可以先写一个Bundle扩展类方便读取数据
extension Bundle {
func decode<T: Codable>(_ file: String) -> T {
guard let url = Bundle.main.url(forResource: file, withExtension: nil),
let data = try? Data(contentsOf: url),
let loaded = try? JSONDecoder().decode(T.self, from: data)
else { fatalError("没取到数据")}
return loaded
}
}
定义模型
通常我们在写列表的时候,都会使用到id,因此我们可以直接遵循Identifiable
类型, 同时我们在读取数据时需要解码,因此需遵循Codable
。
struct Plan: Identifiable, Codable {
let id: Int
let name: String
let launchDate: String
let members: [Members]?
let description: String
let hasBadge: Bool
var imageName: String {
hasBadge ? "shenzhou\(id)" : "placeholder"
}
struct Members: Codable {
let name: String
let birth: String
}
}
获取数据模型
let plans: [Plan] = Bundle.main.decode("plans.json")
网络请求数据(原生)
数据模型
struct Response: Codable{
struct Result: Codable {
let trackId: Int
let collectionName: String
let trackName: String
}
let results: [Result]
}
GET
guard let url = URL(string: "https://itunes.apple.com/search?term=taylor+swift&entity=song")
else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data, let decodedData = try? JSONDecoder().decode(Response.self, from: data)
else { return }
DispatchQueue.main.async {
self.results = decodedData.results
}
}.resume()
POST请求
guard let url = URL(string: "https://reqres.in/api/tea"), let data = try? JSONEncoder().encode(order) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = data
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else { return }
guard let decodedData = try? JSONDecoder().decode(Order.self, from: data) else { return }
let ice = decodedData.isAddIce ? "加冰" : ""
let sugar = decodedData.isAddSugar ? "加糖" : ""
self.message =
"""
服务器已经收到您的订单:
\(decodedData.num)杯奶茶\(ice)\(sugar)
送到以下地址:
\(decodedData.name)
\(decodedData.phone)
\(decodedData.address)
"""
self.showAlert = true
}.resume()