13.Swift 構造函數(shù)

@(〓〓 iOS-Swift語法)[Swift 語法]


iOS Swift 語法 底層原理內(nèi)存管理分析 專題:【iOS Swift5語法】

00 - 匯編
01 - 基礎語法
02 - 流程控制
03 - 函數(shù)
04 - 枚舉
05 - 可選項
06 - 結構體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標
11 - 繼承
12 - 初始化器init
13 - 可選項


目錄

  • 13.Swift 類的構造函數(shù)
  • 1.構造函數(shù)的介紹
  • 2.構造函數(shù)的基本使用
    • 構造函數(shù)的基本使用
    • 初始化時給屬性賦值
    • 字典轉模型(初始化時傳入字典)
    • 字典轉模型(利用KVC轉化)

1.構造函數(shù)的介紹

  • 構造函數(shù)類似于OC中的初始化方法:init方法
  • 默認情況下載創(chuàng)建一個類時,必然會調用一個構造函數(shù)
  • 即便是沒有編寫任何構造函數(shù)旭绒,編譯器也會提供一個默認的構造函數(shù)养筒。
  • 如果是繼承自NSObject,可以對父類的構造函數(shù)進行重寫.

2.構造函數(shù)的基本使用


構造函數(shù)的基本使用

  • 類的屬性必須有值
  • 如果不是在定義時初始化值,可以在構造函數(shù)中賦值
class Person : NSObject {
    var name : String?
    var age : Int = 0
    
    // ------------------------------------------------------------------------
    // 1.1 注意: 在Swift中在本類中實現(xiàn)父類已有的方法,則必須明確指明是`方法的重寫`,使用override
    override init () {
        name = ""
        age = 0
    }
}

// 創(chuàng)建一個Person對象
let p = Person()

初始化時給屬性賦值

  • 很多時候,我們在創(chuàng)建一個對象時就會給屬性賦值
  • 可以自定義構造函數(shù)
  • 注意:如果自定義了構造函數(shù),會覆蓋init()方法.即不在有默認的構造函數(shù)
class Person : NSObject {
    var name : String?
    var age : Int = 0
    
    // ------------------------------------------------------------------------
    // 1.2 自定義構造函數(shù)
    // 如果在一個方法中,`方法中的變量和屬性名同名`,則使用屬性是,需加加上self,不然會有歧義
    // 在`閉包中使用當前類的屬性`也需要加上`self`
    
    // 自定義構造函數(shù),通知指定屬性的值
    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }
}

// 創(chuàng)建一個Person對象
let p = Person(name: "liwx", age: 18)

字典轉模型(初始化時傳入字典)

  • 真實創(chuàng)建對象時,更多的是將字典轉成模型
  • 注意:
    • 去字典中取出的是NSObject,任意類型.
    • 可以通過as!轉成需要的類型,再賦值(不可以直接賦值).如果屬性是可選類型,需用as?將dict["key"]轉成對應的類型.
class Person: NSObject {
    var name : String
    var age : Int

    // ------------------------------------------------------------------------
    // 1.3 自定義構造函數(shù),字典轉模型.從字典中根據(jù)key逐一取出對應的value進行賦值
    init(dict : [String : AnyObject]) {
        
        // 注意: 需將AnyObject轉換成具體類型
        // AnyObject as? String : 將AnyObject轉成字符串的可選類型
        // AnyObject as! String : 將AnyObject轉成字符串類型
        
        // dict["age"]和dict["name"]取出來的都是String?可選類型的,所以需要將可選類型轉為Int類型
        name = dict["name"] as? String
        if let tempAge = dict["age"] as? Int {
            tempAge
            age = tempAge
        }
    }
}

// 創(chuàng)建一個Person對象
let dict = ["name" : "liwx", "age" : 18]
let p = Person(dict: dict)

字典轉模型(利用KVC轉化)

  • 利用KVC字典轉模型會更加方便
  • 注意:
    • KVC并不能保證會給所有的屬性賦值
    • 因此屬性需要有默認值
      • 基本數(shù)據(jù)類型默認值設置為0
      • 對象或者結構體類型定義為可選類型即可(可選類型沒有賦值前為nil)
      • 使用KVC字典轉模型必須先調用super.init()
      • 如果類中沒有字典中的屬性,必須重寫setValueforUndefinedKey方法,不然程序會奔潰
class Person : NSObject {
    var name : String?
    var age : Int = 0
    
// ------------------------------------------------------------------------
    // 1.4 直接通過KVC方式進行賦值. 注意: 如果類中沒有字典中的屬性,必須重寫setValueforUndefinedKey方法,不然程序會奔潰
    // 注意: 在構造函數(shù)中,如果有調用當前對象的某些函數(shù),必須在調用前先寫: super.init()
    init(dict : [String : AnyObject]) {
        
        // 使用KVC字典轉模型必須先調用super.init()
        super.init()
        
        // 調用setValuesForKeysWithDictionary
        setValuesForKeysWithDictionary(dict)
        
    }
    
    // 如果類中沒有字典中的屬性,必須重寫setValueforUndefinedKey方法,不然程序會奔潰
    // 本類中并沒有height屬性,而字典有height屬性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }

}

// 3.通過`字典`轉`模型對象`
let p2 = Person(dict: ["name" : "liwx", "age" : 18, "height" : 1.88])
print(p2.name)
print(p2.age)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撇吞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子获枝,更是在濱河造成了極大的恐慌,老刑警劉巖荐糜,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖链,死亡現(xiàn)場離奇詭異,居然都是意外死亡媳友,警方通過查閱死者的電腦和手機斯议,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醇锚,“玉大人,你說我怎么就攤上這事坯临『富#” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵看靠,是天一觀的道長赶促。 經(jīng)常有香客問我,道長挟炬,這世上最難降的妖魔是什么鸥滨? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谤祖,結果婚禮上婿滓,老公的妹妹穿的比我還像新娘。我一直安慰自己粥喜,他們只是感情好凸主,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著额湘,像睡著了一般卿吐。 火紅的嫁衣襯著肌膚如雪旁舰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天嗡官,我揣著相機與錄音箭窜,去河邊找鬼。 笑死衍腥,一個胖子當著我的面吹牛磺樱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紧阔,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坊罢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擅耽?” 一聲冷哼從身側響起活孩,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乖仇,沒想到半個月后憾儒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡乃沙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年起趾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片警儒。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡训裆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜀铲,到底是詐尸還是另有隱情边琉,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布记劝,位于F島的核電站着茸,受9級特大地震影響巴席,放射性物質發(fā)生泄漏务蝠。R本人自食惡果不足惜匹耕,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怒竿。 院中可真熱鬧砍鸠,春花似錦、人聲如沸愧口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至托嚣,卻和暖如春巩检,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背示启。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工兢哭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夫嗓。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓迟螺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舍咖。 傳聞我的和親對象是個殘疾皇子矩父,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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