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


方法重载不仅仅局限于 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: [String: AnyObject]){
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,          // 评论数量
                        ]