美文网首页
小知识七、KVC构建数据模式

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

作者: ISwiftUI | 来源:发表于2017-02-27 08:55 被阅读4次

    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)
            }
    

    相关文章

      网友评论

          本文标题:小知识七、KVC构建数据模式

          本文链接:https://www.haomeiwen.com/subject/zpzawttx.html