Swift数据获取和建模

15 篇文章 2 订阅

本地文件数据读取和建模

从项目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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值