Swift-構(gòu)造函數(shù),構(gòu)造函數(shù)與KVC

timg.jpg
淘劵吧

  • 構(gòu)造函數(shù)類似于OC中的初始化方法:init方法
  • 默認(rèn)情況下載創(chuàng)建一個(gè)類時(shí),必然會(huì)調(diào)用一個(gè)構(gòu)造函數(shù)
  • 即便是沒有編寫任何構(gòu)造函數(shù)秀撇,編譯器也會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)蒋院。
  • 如果是繼承自NSObject,可以對父類的構(gòu)造函數(shù)進(jìn)行重寫

創(chuàng)建Person類 繼承NSObject

  1. 聲明Name 屬性
class Person: NSObject {
    // 1剔桨,聲明name 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
    var name: String
}
  1. 調(diào)用默認(rèn)初始化器
class Person: NSObject {
   // 1届谈,聲明name 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
   var name: String
   
   // 2 ,調(diào)用默認(rèn)的初始化器 會(huì)報(bào)錯(cuò):(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前鉴嗤,self.name 沒有被初始化))
   override init() {
       print("-----------------Person init()-----------------")
       super.init()
   }
}
  1. 給name賦值
class Person: NSObject {
    // 1盟劫,聲明name 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
    var name: String
    
    // 2 ,調(diào)用默認(rèn)的初始化器 會(huì)報(bào)錯(cuò):(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前航缀,self.name 沒有被初始化))
    override init() {
        //3,Property 'self.name' not initialized at super.init call (提示 self.name 初始化 分配空間商架,設(shè)置初始值)
        // 所以在 super.init() 之前 給name 賦值 
        name = "iOSCodeZhao"
        print("-----------------Person init()-----------------")
        super.init()
    }
}

實(shí)例化Person 調(diào)用構(gòu)造函數(shù)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let person = Person();
        print(person.name)
    }
}

重寫,重載

重寫:父類有這個(gè)方法芥玉,子類重新實(shí)現(xiàn) 需要 override 關(guān)鍵字 如: override func viewDidLoad() {}

重載: 函數(shù)名相同 但是參數(shù)和個(gè)數(shù)不同蛇摸,重載可以給自己的屬性從外部設(shè)置初始值, OC沒有重載灿巧,僅有initWith xxx 自定義初始化方法赶袄; 如果重載了構(gòu)造函數(shù),并不沒有實(shí)現(xiàn)父類 init 方法抠藕,系統(tǒng)不再提供init() 構(gòu)造函數(shù)默認(rèn)是有的

class Person: NSObject {
    var name: String
    
    // 重寫
    override init() {
        print("Person init")
        name = "趙師順"
        super.init()
    }
    //重載
    init(name: String) {
        self.name = name;
        super.init()
    }
}

調(diào)用Person的重載

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 調(diào)用系統(tǒng) 構(gòu)造函數(shù)
        let person = Person();
        print(person.name)
        // 重載
        let p = Person(name: "隔壁老王")
        print(p.name)
    }
}

控制臺(tái)輸出結(jié)果

屏幕快照 2017-09-08 下午4.10.54.png

構(gòu)造函數(shù)與KVC

注意事項(xiàng):
1饿肺,定義模型屬性的時(shí)候,如果是對象盾似,通常都是可選的
2敬辣, 如果是基本數(shù)據(jù)類型不能設(shè)置成可選的,而且要設(shè)置初始值
3,使用KVC 方法之前 應(yīng)該調(diào)用 super.init()
4溉跃,如果使用KVC 設(shè)置數(shù)值村刨,屬性不能是private 的

class Person: NSObject {
    // 在OC中很多屬性都是在需要的時(shí)候創(chuàng)建
    // 因?yàn)樵谑謾C(jī)開發(fā),內(nèi)存寶貴撰茎,有些屬性并不一定需要分配空間
    // 延遲加載嵌牺,在需要的時(shí)候在創(chuàng)建
    var name: String?
    // 給基本數(shù)據(jù)類型做初始化
    var age = 0
    // 如果是Private 私有屬性,使用KVC設(shè)置值的時(shí)候乾吻,同樣無法設(shè)置
    // 如果設(shè)置成private  禁止外部訪問
    private var title: String?
    
    // 重載構(gòu)造函數(shù)髓梅,使用字典為本類設(shè)置初始值
    init(dict: [String: AnyObject]) {
        super.init()
        // Use of 'self' in method call 'setValuesForKeys' before super.init initializes self(在使用setValuesForKeys之前 調(diào)用 super.init)
        //  KVC 方法是 OC方法,特點(diǎn)就是在運(yùn)行時(shí)給對象發(fā)送消息
        // 所以要求 對象已經(jīng)實(shí)例化完成  而且name 是個(gè)可選值 所以        super.init() 放在前面
        setValuesForKeys(dict)
    }
}

調(diào)用

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let p  = Person(dict: ["name": "肇事順" as AnyObject])
        print(p.name ?? "")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绎签,一起剝皮案震驚了整個(gè)濱河市枯饿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诡必,老刑警劉巖奢方,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爸舒,居然都是意外死亡蟋字,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門扭勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹊奖,“玉大人,你說我怎么就攤上這事涂炎≈揖郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵唱捣,是天一觀的道長两蟀。 經(jīng)常有香客問我,道長震缭,這世上最難降的妖魔是什么赂毯? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拣宰,結(jié)果婚禮上党涕,老公的妹妹穿的比我還像新娘。我一直安慰自己巡社,他們只是感情好遣鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著重贺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上气笙,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天次企,我揣著相機(jī)與錄音,去河邊找鬼潜圃。 笑死缸棵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谭期。 我是一名探鬼主播堵第,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隧出!你這毒婦竟也來了踏志?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胀瞪,失蹤者是張志新(化名)和其女友劉穎针余,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凄诞,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圆雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帆谍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪朽。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汛蝙,靈堂內(nèi)的尸體忽然破棺而出烈涮,到底是詐尸還是另有隱情,我是刑警寧澤患雇,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布跃脊,位于F島的核電站,受9級特大地震影響苛吱,放射性物質(zhì)發(fā)生泄漏酪术。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一翠储、第九天 我趴在偏房一處隱蔽的房頂上張望绘雁。 院中可真熱鬧,春花似錦援所、人聲如沸庐舟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挪略。三九已至历帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杠娱,已是汗流浹背挽牢。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摊求,地道東北人禽拔。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像室叉,于是被迫代替她去往敵國和親睹栖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容