五.KVC構(gòu)造方法:
- KVC構(gòu)造函數(shù),利用運行時的機制,在運行的時候,給對象動態(tài)調(diào)用setValue forKey方法,來給屬性賦值;
- 對象需要實例化成功:須在self初始化完成后調(diào)用KVC(也就是super.init()后面)
- swift中,int屬于OC中的基本數(shù)據(jù)類型,基本數(shù)據(jù)類型與KVC不兼容
- 基本數(shù)據(jù):類型在使用KVC情況下,應(yīng)使用非可選項并且初始化,需要在給swift中給基本數(shù)據(jù)類型一個默認值,默認值不能為nil;
- 當我們給了初始值的時候,KVC就能找到基本類型屬性
綜上:KVC賦值的注意點:
- super.init()須在KVC方法前調(diào)用,完成對象初始化;
- swift的KVC不支持基本數(shù)據(jù)類型,應(yīng)在KVC前給基本數(shù)據(jù)類型賦值一個初始值,且不能為nil;
- 或者重寫
setValue(value:AnyObject?, forUndefinedKey)key:String)
override setValue(value:AnyObject?, forUndefinedKey key:String)
{不要調(diào)用super方法;
super的這個方法就是提供一個崩潰,告訴你哪個值沒
有賦值}
- 如果實現(xiàn)了 forUndefinedKey,會保證 setValuesForKeysWithDictionary繼續(xù)遍歷后續(xù)的 key
- 父類實現(xiàn)了forUndefinedKey這個方法,子類就可以不實現(xiàn)了
- 執(zhí)行步驟:
- 先setValue(value:AnyObject?, key:String)
- 發(fā)現(xiàn)屬性中某個屬性沒有的時候,會調(diào)用setValue(value:AnyObject?, forUndefinedKey key:String)
- 子類的KVC構(gòu)造函數(shù)父類實現(xiàn)了KVC,子類可以不去實現(xiàn)KVC;
- 當子類調(diào)用KVC時,沒有提示,需要強寫;
六.便利構(gòu)造函數(shù):
- 便利構(gòu)造函數(shù)的關(guān)鍵字:convenience init?(參數(shù)){ }
- 便利構(gòu)造函數(shù)可能返回一個nil
- 便利構(gòu)造函數(shù)是為一個需要借助于調(diào)用self的其他構(gòu)造函數(shù),而不是super.init
- 便利構(gòu)造函數(shù)不可以重寫
- 便利構(gòu)造函數(shù)能夠?qū)鬟f進來的參數(shù)進行判斷,如果滿足條件,則返回一個值,不滿足返回另外一個值(例如nil)
- 調(diào)用便利構(gòu)造方法創(chuàng)建的對象,對象本身是可選項,調(diào)用屬性時,對象后面加個?:p?.name
- 子類可以繼承父類的便利構(gòu)造方法,但是不能重寫;