【Swift大法好:昨天看博客的時候看到,有說Swift之後有可能開發安卓軟件了。cool。。。】ide
默認狀況下,全部的構造方法都是指定構造函數 Designated
函數
convenience
關鍵字修飾的構造方法就是便利構造函數this
便利構造函數具備如下特色:spa
能夠返回 nil
code
只有便利構造函數中能夠調用 self.init()
對象
便利構造函數不能被重寫
或者 super
ip
根據給定參數判斷是否建立對象,而不像指定構造函數那樣必需要實例化一個對象出來內存
在實際開發中,能夠對已有類的構造函數進行擴展,利用便利構造函數,簡化對象的建立開發
指定構造函數必須調用其直接父類的的指定構造函數(除非沒有父類)博客
便利構造函數必須調用同一類中定義的其餘指定構造函數
或者用 self.
的方式調用父類的便利構造函數
便利構造函數能夠返回 nil、
import UIKit
/* -- KVC構造函數
KVC屬性賦值的原理 -- 系統會給 實例化對象動態的發送 setValue(value: AnyObject?, forKey key: String) ,來給屬性賦值
1.這個實例化對象 必須存在, 內存分配
2.屬性分配內存
*/
class Person: NSObject {
// 可選項,在初始化的時候會分配內存空間,默認值爲nil
//姓名
var name: String?
// this class is not key value coding-compliant for the key age
// 年齡
// age 基本數據類型 -- 在Swift 裏與 KVC不兼容
// age的默認值爲nil, KVC找不這個屬性
// 默認給這個 age = 0
var age: Int = 0
var sex: Int = 0
/*
便利構造 -- 能夠根據 咱們的屬性來動態的判斷是否會返回值
1. 有可能找不到對象, 返回 nil
2. 便利構造須要藉助其餘的構造函數
3. 便利構造函數的關鍵字-- convenience
*/
//person 便利構造方法
convenience init?(name: String,age: Int,sex:Int) {
// 找對象的條件 -- 小於 18的 不行, 大於 25的不行, 我是男的,我得找女的
if age < 18 || age > 25 || sex == 1 {
return nil
}
// 必須初始化
self.init(dic:["name":name,"age":age,"sex":sex])
}
//kvc構造方法
init(dic: [String:AnyObject]) {
// 報錯問題一: 調用 setValuesForKeysWithDictionary方法以前,必須調用 super.init
// 1. 完成本類的初始化
// 2. 父類也會初始化
// 3. 須要給 本類屬性,進行初始化操做,進行初始化操做能夠 在這個init裏完成,name = "老王"
// 咱們想經過 KVC動態給屬性賦值, 咱們就須要把 屬性設置成 可選項
super.init()
// 實例化對象已經建立完成,而後再調用 setValuesForKeysWithDictionary
// 調用 setValuesForKeysWithDictionary -- 調用 setValue for key 來給屬性賦值
setValuesForKeysWithDictionary(dic)
}
//重寫descriotion
override var description: String {
// 注意 keys
let keys = ["sex","name","age"]
return dictionaryWithValuesForKeys(keys).description
}
}