swift:字典转模型构造方法

    xiaoxiao2021-12-01  16

    重载方法名相同,参数个数/参数类型不同

    方法重载不仅仅局限于 init构造方法,其他的方法也同样使用

    在init的构造方法中, 不需要在前面加func , 重写init需要添加关键字override . 在init方法中,需要在super.init之前完成初始化,这点与OC不同

    重写是因为,系统提供的方法不能满足我们对属性的初始化的需要,在对属性初始化时,一定要用self声明属性是谁的,以防止赋值混淆

    注: Xcode 7 bate 5 之后, 系统会默认 为我们调用super.init   不过, 建议熟练之前, 写上

    KVC构造函数注意点: 基本数据类型不与KVC 兼容, 在KVC动态赋值的时候,找不到这个属性. 

    解决办法: 在定义一个基本数据类型的同时设置默认值, 才能在KVC动态赋值的时候查找到这个属性 

    例如: var age: Int = 0

    KVC属性赋值的原理系统在运行时的时候,会动态的给 对象发送setValue forKey 这个方法,来给属性赋值

    KVC属性赋值满足的2个条件: 1.对象得创建完成 2.属性完成初始化

    init(dict: [StringAnyObject]){

    super.init()

    setValuesForKeysWithDictionary(dict)

    }

    同时为防止属性赋值,出现未定义的属性赋值产生崩溃,最好重写 forUndefinedKey 方法

    forUndefinedKey 这个方法就是 字典里的key 找不对应的属性,就会抛出一个异常,如果我们重写这个方法,不调用父类方法,就可以不抛出异常

    override func setValue(value: AnyObject?, forUndefinedKey key: String) {

    } //里面什么也不要写

    ArticleListModel.swift里的模型文件:

    import UIKit

    class JFArticleListModel: NSObject {

        

        /// 作者昵称

        var username: String?

        

        /// 点击量

        var onclick: String?

        

        /// 发布时间

        var newstime: String?

        

        /// 创建文章时间戳

        var created_at: String?

        

        /// 文章id

        var id: String?

        

        /// 文章标题

        var title: String?

        

        /// 标题图片url

        var titlepic: String?

        

        /// 文章简介

        var smalltext: String?

        

        /// 数据表名

        var table: String?

        

        /// 父栏目id

        var bclassid: String?

        

        /// 当前栏目id

        var classid: String?

        

        /// 当前栏目名称

        var classname: String?

        

        /// 评论数量

        var plnum: String?

        

        /// 标题图片数量

        var piccount: Int = 0

        

        /// 多图数组 存储多张标题图片url的数组

        var morepic: [String]?

        

        /// 存储形变改变的偏移量

        var offsetY: CGFloat = 0

        

        /// 缓存行高

        var rowHeight: CGFloat = 0.0

        

        /**

         字典转模型构造方法

         */

        init(dict: [String : AnyObject]) {

            super.init()

            setValuesForKeysWithDictionary(dict)

        }

        

        override func setValue(value: AnyObject?, forUndefinedKey key: String) {}

        

    }

    NewsTableViewController.swift里的方法:

       // 字典转模型

    let postModel = ArticleListModel(dict: dict)

                            

     var dict: [String : AnyObject] = [

                                "title" : article["title"].stringValue,          // 文章标题

                                "bclassid" : article["bclassid"].stringValue,    // 终极栏目id

                                "classid" : article["classid"].stringValue,      // 当前子分类id

                                "newstime" : article["newstime"].stringValue,    // 发布时间

                                "created_at" : article["created_at"].stringValue,// 创建文章时间戳

                                "username" : article["username"].stringValue,    // 用户名

                                "onclick" : article["onclick"].stringValue,      // 点击量

                                "smalltext" : article["smalltext"].stringValue// 简介

                                "id" : article["id"].stringValue,                // 文章id

                                "classname" : article["classname"].stringValue// 分类名称

                                "table" : article["table"].stringValue,          // 数据表名

                                "plnum" : article["plnum"].stringValue,          // 评论数量

                            ]

    转载请注明原文地址: https://ju.6miu.com/read-679301.html

    最新回复(0)