Swift 結(jié)構(gòu)體構(gòu)造器

  • Swift 中的結(jié)構(gòu)體和類跟其它面向?qū)ο笳Z言一樣都有構(gòu)造函數(shù), 而OC是沒有的
  • Swift 要求實例化一個結(jié)構(gòu)體或類的時候, 所有的成員變量都必須有初始值
  • 構(gòu)造函數(shù)的意義就是用于初始化所有成員變量的, 而不是分配內(nèi)存, 分配內(nèi)存是系統(tǒng)幫我們做的.
  • 如果結(jié)構(gòu)體中的所有屬性都有默認(rèn)值, 可以調(diào)用 ()構(gòu)造一個結(jié)構(gòu)體實例如果結(jié)構(gòu)體中的屬性沒有默認(rèn)值, 可以自定義構(gòu)造器, 并在構(gòu)造器中給所有的屬性賦值

在Swift中,定義為結(jié)構(gòu)體的類型會自動獲得由編譯器生成的默認(rèn)初始化程序——所謂的“成員構(gòu)造器”结借,因為編譯器將根據(jù)給定結(jié)構(gòu)體的成員(即其存儲的屬性)生成該初始化程序硬毕。

例如,如果我們定義了一個User具有nameage屬性的結(jié)構(gòu)體辫继,則可以使用其成員構(gòu)造器來簡單地通過傳遞這兩個屬性的值來創(chuàng)建實例:

struct User {
    var name: String
    var age: Int
}

let user = User(name: "韋弦", age: 9)

另一方面,當(dāng)編譯器合成成員構(gòu)造器時,將完全忽略計算屬性——因此喻圃,即使我們添加一個成員屬性蒋纬,我們?nèi)匀豢梢韵褚郧耙粯永^續(xù)使用上述初始化程序:

struct User {
    var name: String
    var age: Int
    var isAdult: Bool { age >= 18 }
}

let user = User(name: "韋弦", age: 9)

從 Swift 5.1 開始猎荠,成員構(gòu)造器也考慮了默認(rèn)屬性值——這意味著,如果我們?yōu)?code>age屬性提供默認(rèn)值颠锉,則User只需傳遞一個name即可創(chuàng)建實例:

struct User {
    var name: String
    var age: Int = 18
    var isAdult: Bool { age >= 18 }
}

// 有如下兩種初始化方式
let user1 = User(name: "zhy")
let user2 = User(name: "韋弦", age: 9)

如果該類型具有private私有屬性法牲,只要這些屬性具有默認(rèn)值,我們還是可以正常使用其成員構(gòu)造器琼掠,和上面沒有差異拒垃,但是如果私有屬性沒有默認(rèn)值,則必須手動編寫該類型的構(gòu)造器——以便能夠從外部傳入值為該屬性賦值:

struct User {
    var name: String
    private var age: Int
    var isAdult: Bool { age >= 18 }

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let user = User(name: "韋弦", age: 9)

不過瓷蛙,要記住的一件事是悼瓮,成員構(gòu)造器永遠不會具有高于internal的訪問級別,這意味著我們只能在定義其類型的模塊內(nèi)部使用它們艰猬。

最初横堡,這似乎是一個奇怪的限制,但它確實有其優(yōu)點冠桃,因為我們可以說應(yīng)該始終設(shè)計供公眾使用的顯式API命贴,而不必將它們與數(shù)據(jù)的內(nèi)部結(jié)構(gòu)聯(lián)系在一起。

因此,總而言之胸蛛,在以下情況下污茵,我們可以使用結(jié)構(gòu)體默認(rèn)生成的成員構(gòu)造器:

  • 它的所有成員都是可見的或具有默認(rèn)值。
  • 我們正在與定義該結(jié)構(gòu)體的模塊相同的模塊中創(chuàng)建一個實例葬项。

所有其他情況都要求我們至少到目前為止至少手動實現(xiàn)一個初始化程序泞当。

當(dāng)我們?yōu)榻Y(jié)構(gòu)體創(chuàng)建便利構(gòu)造器的時候,我們可以在 擴展extension 中聲明該便利構(gòu)造器民珍,這樣做的好處是襟士,當(dāng)我們定義一些便利構(gòu)造器方便初始化的同時,不會覆蓋編譯器生成的成員構(gòu)造器:

struct User {
    var name: String
    var gender: Gender
    var age: Int
    var isAdult: Bool { age >= 18 }

    enum Gender {
        case man,woman,other
    }
}


extension User {
    init(name: String, age: Int) {
        self.init(name: name, gender: .man, age: 18)
    }
}

// 可以有如下兩種初始化方法
let user1 = User(name: "韋弦", age: 9)
let user2 = User(name: "zhy", gender: .man, age: 18)

如果直接寫在結(jié)構(gòu)體內(nèi)嚷量,則初始化 user2代碼會報錯陋桂,只剩下新聲明的便利構(gòu)造器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末津肛,一起剝皮案震驚了整個濱河市章喉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身坐,老刑警劉巖秸脱,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異部蛇,居然都是意外死亡摊唇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門涯鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巷查,“玉大人,你說我怎么就攤上這事抹腿〉呵耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵警绩,是天一觀的道長崇败。 經(jīng)常有香客問我,道長肩祥,這世上最難降的妖魔是什么后室? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮混狠,結(jié)果婚禮上岸霹,老公的妹妹穿的比我還像新娘。我一直安慰自己将饺,他們只是感情好贡避,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布痛黎。 她就那樣靜靜地躺著,像睡著了一般贸桶。 火紅的嫁衣襯著肌膚如雪舅逸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天皇筛,我揣著相機與錄音,去河邊找鬼坠七。 笑死水醋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彪置。 我是一名探鬼主播拄踪,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拳魁!你這毒婦竟也來了惶桐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤潘懊,失蹤者是張志新(化名)和其女友劉穎姚糊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體授舟,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡救恨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了释树。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肠槽。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奢啥,靈堂內(nèi)的尸體忽然破棺而出秸仙,到底是詐尸還是另有隱情,我是刑警寧澤桩盲,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布寂纪,位于F島的核電站,受9級特大地震影響正驻,放射性物質(zhì)發(fā)生泄漏弊攘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一姑曙、第九天 我趴在偏房一處隱蔽的房頂上張望襟交。 院中可真熱鬧,春花似錦伤靠、人聲如沸捣域。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焕梅。三九已至迹鹅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞言,已是汗流浹背斜棚。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留该窗,地道東北人弟蚀。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像酗失,于是被迫代替她去往敵國和親义钉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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