重载: 方法名相同,参数个数/参数类型不同
方法重载不仅仅局限于 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, // 评论数量
]