Typealias/模型设置类型别名, Escaping/转义闭包, Codable/模型可编码协议 的使用

news/2024/7/20 21:48:39 标签: iOS, Swift, UI

1. Typealias 模型设置类型别名

  1.1 实现

Swift">struct MovieModel {
    let title: String
    let director: String
    let count: Int
}

// 赋值 Model
typealias TVModel = MovieModel

// 设置类型别名
struct TypealiasBootcamp: View {
    //@State var item = MovieModel(title: "Title", director: "Joe", count: 5)
    @State var item = TVModel(title: "TV title", director: "Emmily", count: 10)
    var body: some View {
        VStack {
            Text(item.title)
            Text(item.director)
            Text("\(item.count)")
        }
    }
}

2. Escaping 定义转义闭包

  2.1 实现

Swift">/// ViewModel 中转义闭包操作
class EscapingViewModel: ObservableObject{
    @Published var text: String = "Hello"
    
    func getData(){
        // [weak self] 表示弱引用
        //downloadData3 { [weak self] data in
        //    self?.text = data
        //}
        
        //downloadData4 { [weak self] result in
        //    self?.text = result.data
        //}
        
        downloadData5 { [weak self] downloadCompletion in
            self?.text =  downloadCompletion.data
        }
    }
    
    // 下载数据
    func downloadData() -> String{
        return "New Data"
    }
    
    // 下载数据 2
    func downloadData2(completionHandler:(_ data: String) -> ()){
        completionHandler("New data!!!")
    }
    
    // 下载数据 3
    func downloadData3(completionHandler:@escaping (_ data: String) -> ()){
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            completionHandler("New data!")
        }
    }
    
    // 下载数据 4
    func downloadData4(completionHandler:@escaping (DownloadResult) -> ()){
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            let downloadResult = DownloadResult(data: "New data!")
            completionHandler(downloadResult)
        }
    }
    
    // 下载数据 5
    func downloadData5(completionHandler:@escaping DownloadCompletion){
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            let downloadResult = DownloadResult(data: "New data!")
            completionHandler(downloadResult)
        }
    }
}

// 下载返回结果
struct DownloadResult {
    let data: String
}

// 定义类型
typealias DownloadCompletion = (DownloadResult) -> ()
    
/// 转义闭包
struct EscapingBootcamp: View {
    @StateObject var viewModel = EscapingViewModel()
    var body: some View {
        Text(viewModel.text)
            .font(.largeTitle)
            .fontWeight(.semibold)
            .foregroundColor(.blue)
            .onTapGesture {
                viewModel.getData()
            }
    }
}

3. Codable 对模型进行可编码协议

  3.1 实现

Swift">// Codable = Decodable + Encodable
// 可编码 = 可解码 + 可编码

// Decodable, Encodable = Codable
// Decodable: 表示可以用数据初始化客户模型,并且将数据解码为模型
struct CustomerModel: Identifiable, Codable{
    let id: String
    let name: String
    let points: Int
    let isPremium: Bool
    
    /*init(id: String, name: String, points: Int, isPremium: Bool){
        self.id = id
        self.name = name
        self.points = points
        self.isPremium = isPremium
    }
    
    enum CodingKeys: String, CodingKey{
        case id
        case name
        case points
        case isPremium
    }

    // 解码数据
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(String.self, forKey: .id)
        self.name = try container.decode(String.self, forKey: .name)
        self.points = try container.decode(Int.self, forKey: .points)
        self.isPremium = try container.decode(Bool.self, forKey: .isPremium)
    }
    
    // 编码数据
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(name, forKey: .name)
        try container.encode(points, forKey: .points)
        try container.encode(isPremium, forKey: .isPremium)
    }*/
}

class CodableViewModel: ObservableObject{
    @Published var customer: CustomerModel? = nil
    
    init() {
        getData()
    }
    
    func getData(){
        // 获取 JSON 数据
        guard let data = getJSONData() else { return }
        
        // 解码数据
        self.customer = try? JSONDecoder().decode(CustomerModel.self, from: data)
        
        /*do{
            self.customer = try JSONDecoder().decode(CustomerModel.self, from: data)
        } catch let error{
           print("Error decoding. \(error)")
        }*/
        
        /*if
         let localData = try? JSONSerialization.jsonObject(with: data,options: []),
         let dictionary = localData as? [String : Any],
         let id = dictionary["id"] as? String,
         let name = dictionary["name"] as? String,
         let point = dictionary["points"] as? Int,
         let isPremium = dictionary["isPremium"] as? Bool{
         
         let newCustomer = CustomerModel(id: id, name: name, points: point, isPremium: isPremium)
         customer = newCustomer
         }*/
    }
    
    func getJSONData() -> Data? {
        // 模拟网络 JSON 数据
        let customer = CustomerModel(id: "007", name: "Emily", points: 100, isPremium: false)
        let jsonData = try? JSONEncoder().encode(customer)
        /*let dictionary:[String : Any] = [
            "id":    "12345" ,
            "name":  "Joe",
            "points":  5 ,
            "isPremium": true
        ]
        // JSON 序列化
        let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options: [])*/
        return jsonData
    }
}

// 可编码协议
struct CodableBootcamp: View {
    @StateObject var viewModel = CodableViewModel()
    
    var body: some View {
        VStack(spacing: 20) {
            if let customer = viewModel.customer{
                Text(customer.id)
                Text(customer.name)
                Text("\(customer.points)")
                Text(customer.isPremium.description)
            }
        }
        .font(.title)
    }
}

  3.2 效果图:


http://www.niftyadmin.cn/n/5056252.html

相关文章

基于YOLOv8模型的蜜蜂目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的蜜蜂目标检测系统可用于日常生活中检测与定位蜜蜂目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

网工软考 | 软考高级里哪个好考?

IT行业是一个快速发展的行业,各种新技术层出不穷,每年都有大量的考生参加软考高级考试,以提升个人的职业水平并获取更广阔的职业发展空间。 但是对于新手来说,面对众多的科目,很难选择一个最适合自己的科目。 本文将…

战队集结 蓄势而发 | 网安朝阳·西门子白帽黑客大赛

网安朝阳西门子白帽黑客大赛国际精英挑战赛 在北京市朝阳区人民政府的鼎力支持下 将于10月12日整装启航 经过层层选拔 48名顶尖网安高手 组建8支CTF精英战队 向冠军之位发起挑战 01、赛制创新发布 白帽黑客大赛,是西门子中国网络与信息安全社群——西安社&#…

【生成对抗网络】初识GAN

论文链接:https://arxiv.org/abs/1406.2661v1 前言 生成对抗网络(Generative Adversarial Nets, GAN)是由Ian Goodfellow,Yoshua Bengio等人在2014年提出的,直到现在,依旧是最火的生成任务算法…

数字孪生:降低现代船舶水声设备研制风险与成本的关键要素

声波是海洋中唯一能够有效传递远距离信息的载体,1000Hz的声波在海水中的每公里吸收衰减仅为0.067分贝,而在陆地上大显神通的电磁波由于受到海水高介电常数和高导电率的影响,因传播衰减量太大而无法通信。 声波在海洋中的传播也并非一帆风顺。…

HC32 IIC/I2C读写

IIC状态码 IIC 初始化 void iicInit(uint32_t speed) {stc_gpio_cfg_t stcGpioCfg;DDL_ZERO_STRUCT(stcGpioCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //开启GPIO时钟门控stcGpioCfg.enDir GpioDirOut; ///< 端口方向配置…

WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境

随着数字化转型的加速&#xff0c;政府机构与企业对高效、安全的即时通讯和协作工具的需求日益增长。企业微信和钉钉作为当前市场上较为常见的通讯工具&#xff0c;虽然在一定程度上满足了企业内部协作的需求&#xff0c;但仍存在一些问题&#xff0c;如数据安全性、私有化部署…

医疗图像分割指标

医疗图像其中两种图像格式&#xff1a;MRI&#xff08;Magnetic Resonance Imaging&#xff0c;磁共振成像&#xff09;、CT&#xff08;Computed Tomography&#xff0c;计算机断层&#xff09;&#xff0c;常存成 .nii.gz 格式。都是 3D 的 H W L H \times W \times L HWL…