小知识七、KVC构建数据模式

1.第一种简单的模型

class Person: NSObject {
    //name是可选的, 在OC中很多的属性都是在需要的时候创建的
    //例如: vc.view  tableViewCell.textLbale  因为在手机开发中,内存很宝贵,有些属性并不是一定需要分配空间的
    //延时加载,在需要的时候创建
    var name: String?


    //给基本数据类型初始化
    //使用KVC会提示无法找到age的KEY,因为Int是一个基本数据类型的结构体,OC中只有基本数据类型。因此对于基本数据类型要设置初始值。
    var age: Int = 0
//    var age: Int?

    //私有属性
    //如果是private属性,使用KVC设置值的时候,同样无法设置
    //如果设置为private属性是禁止外部访问的
//    private var title: String?
     var title: String?
    init(dict: [String: AnyObject]) {
        super.init()
        //setValuesForKeys是KVC方法
        //KVC的方法又是OC的方法,在运行时给对象发送消息,这点要求对象已经实例化完成。super.init()就是用来保证对象初始化完成。
        setValuesForKeys(dict)

    }
    //重写父类的方法
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        //没有调用super,将父类的代码完全覆盖,不会崩溃
    }
}
复制代码

1.第二种模型中嵌套模型

import UIKit

class AnchorModel: NSObject {
    /// 房间ID
    var room_id : Int = 0
    /// 房间图片对应的URLString
    var vertical_src : String = ""
    /// 判断是手机直播还是电脑直播
    // 0 : 电脑直播(普通房间) 1 : 手机直播(秀场房间)
    var isVertical : Int = 0
    /// 房间名称
    var room_name : String = ""
    /// 主播昵称
    var nickname : String = ""
    /// 观看人数
    var online : Int = 0
    /// 所在城市
    var anchor_city : String = ""
    
    init(dict : [String : Any]) {
        super.init()
        
        setValuesForKeys(dict)
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

class BaseGameModel: NSObject {
    // MARK:- 定义属性
    var tag_name : String = ""
    var icon_url : String = ""
    
    // MARK:- 自定义构造函数
    override init() {
        
    }
    
    init(dict : [String : Any]) {
        super.init()
        
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

class AnchorGroup: BaseGameModel {
    /// 该组中对应的房间信息
    var room_list : [[String : NSObject]]? {
        didSet {
            guard let room_list = room_list else { return }
            for dict in room_list {
                anchors.append(AnchorModel(dict: dict))
            }
        }
    }
    /// 组显示的图标
    var icon_name : String = "home_header_normal"
    /// 定义主播的模型对象数组
    lazy var anchors : [AnchorModel] = [AnchorModel]()
}
复制代码

使用 eg:

func test() {
        
        let bigDataGroup : AnchorGroup = AnchorGroup()
        let result = [String: Any]()
        // 1.将result转成字典类型
        guard let resultDict = result as? [String : NSObject] else { return }
        
        // 2.根据data该key,获取数组
        guard let dataArray = resultDict["data"] as? [[String : NSObject]] else { return }
        
        // 3.遍历字典,并且转成模型对象
        // 3.1.设置组的属性
        bigDataGroup.tag_name = "热门"
        bigDataGroup.icon_name = "home_header_hot"
        
        // 3.2.获取主播数据
        for dict in dataArray {
            let anchor = AnchorModel(dict: dict)
            bigDataGroup.anchors.append(anchor)
        }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值