亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift中初始化init的方法小結

2020-03-09 17:41:57
字體:
來源:轉載
供稿:網友

前言

我們在深入初始化方法之前,不妨先再想想Swift中的初始化想要達到一種怎樣的目的。

其實就是安全。在Objective-C中,init方法是非常不安全的:沒有人能保證init只被調用一次,也沒有人保證在初始化方法調用以后,實例的各個變量都完成初始化,甚至如果在初始化里使用屬性進行設置的話,還可能會造成各種問題。雖然Apple也明確說明了不應該在init中使用屬性來訪問,但這并不是編譯器強制的,因此還是會有很多開發者犯這樣的錯誤。

所以Swift有了超級嚴格的初始化方法。一方面,Swift強化了designated初始化方法的地位。Swift中不加修飾的init方法都需要在方法中保證所有非Optional的實例變量被賦值初始化,而在子類中也強制 (顯式或隱式地)調用super版本的designated初始化,所以無論如何走何種路徑,被初始化的對象總是可以完成完整的初始化的。

Swift 的初始化和 Objective-C 有一個很大的不同,Objective-C 默認會給每個屬性賦一個空值,如 nil 或者 0,但 Swift 的初始化更加嚴格,需要開發者自己顯示指定類成員的初始值,否則編譯會報錯。

結構體初始化

如果結構體沒有實現任何初始化函數,Swift 默認給生成一個包含所有成員變量的初始化構造器。

struct RocketConfiguration { let name: String = "Athena 9 Heavy" let numberOfFirstStageCores: Int let numberOfSecondStageCores: Int let numberOfStageReuseLandingLegs: Int}

如果使用如下的代碼初始化這個結構體:

let athena9Heavy = RocketConfiguration()

將產生編譯錯誤,如下圖:

Swift,init,方法初始化

有兩種做法可以消除錯誤,聲明結構體成員時即賦值,如下:

struct RocketConfiguration { let name: String = "Athena 9 Heavy" let numberOfFirstStageCores: Int = 3 let numberOfSecondStageCores: Int = 1 let numberOfStageReuseLandingLegs: Int? = nil}let athena9Heavy = RocketConfiguration()

但這種情況下,成員變量無法再修改,除非將let改成var?;蛘呤褂媚J的初始化構造器,給每個成員賦一個初始化的值:

struct RocketConfiguration { let name: String = "Athena 9 Heavy" let numberOfFirstStageCores: Int let numberOfSecondStageCores: Int let numberOfStageReuseLandingLegs: Int}let athena9Heavy = RocketConfiguration(numberOfFirstStageCores: 3, numberOfSecondStageCores: 1, nominalBurnTime: nil)

類的初始化

和結構體不同的是,類必須自己聲明初始化構造器:

class LaunchSite { let name: String let coordinates: (String, String)  init(name: String, coordinates: (String, String)) {  self.name = name  self.coordinates = coordinates }}

如果去掉上面的init函數,將產生編譯錯誤,如下圖:

Swift,init,方法初始化

指定構造器(Designated Initializers)

指定構造器對所有沒有默認值的非可選屬性進行初始化。

class RocketComponent { let model: String let serialNumber: String let reusable: Bool  // Init #1a - Designated init(model: String, serialNumber: String, reusable: Bool) {  self.model = model  self.serialNumber = serialNumber  self.reusable = reusable }} 

初始化調用:

let payload = RocketComponent(model: "RT-1", serialNumber: "234", reusable: false)

便利構造器(Convenience Initializers)

便利構造器是在init前加一個關鍵子convenience,它為一些屬性提供默認值:

// Init #1b - Convenienceconvenience init(model: String, serialNumber: String) { self.init(model: model, serialNumber: serialNumber, reusable: false)}

這樣,在初始化時就無需給所有屬性賦值,如下:

let fairing = RocketComponent(model: "Serpent", serialNumber: "0")

便利構造器通常要調用類自身的便利構造器或者指定構造器,不管是哪種,最終都要調用指定構造器。如下圖:

Swift,init,方法初始化

子類的初始化

class Tank: RocketComponent { let encasingMaterial: String}

這段代碼會產生編譯錯誤:

Swift,init,方法初始化

encasingMaterial 沒有初始化值,Swift 的原則是,所有屬性在初始化階段都要完成賦值,因為 Swift 不會給屬性賦默認值,需要開發者自己完成。簡單做法是給encasingMaterial屬性一個默認值:

class Tank: RocketComponent { let encasingMaterial: String = "Aluminum"}let fuelTank = Tank(model: "Athena", serialNumber:"003", reusable: true)

或者聲明一個指定構造器:

class Tank: RocketComponent { let encasingMaterial: String init(model: String, serialNumber: String, reusable: Bool, encasingMaterial: String) {  self.encasingMaterial = encasingMaterial  super.init(model: model, serialNumber: serialNumber, reusable: reusable) }}let fuelTank = Tank(model: "Athena", serialNumber:"003", reusable: true, encasingMaterial: "Aluminum")

需要注意的是,子類自身屬性的初始化需要在調用父類的初始化構造器前完成,如下代碼

init(model: String, serialNumber: String, reusable: Bool, encasingMaterial: String) {  super.init(model: model, serialNumber: serialNumber, reusable: reusable)  self.encasingMaterial = encasingMaterial }

將產生編譯錯誤,如下圖:

Swift,init,方法初始化

父類屬性的初始化,需要在調用父類構造器之后:如下:

init(model: String, serialNumber: String, reusable: Bool, encasingMaterial: String) { self.encasingMaterial = encasingMaterial super.init(model: model, serialNumber: serialNumber, reusable: reusable) self.model = model + "-X"}

要先調用父類的構造器,以防止先給屬性賦值了然后才調用父類而把以前的賦值覆蓋了。若把self.model放在super.init之前,會產生編譯錯誤:

Swift,init,方法初始化

初始化調用順序

  • 便利構造器需要調用類自身的便利構造器或指定構造器,最終要調用類自身的指定構造器。
  • 子類的指定構造器需要調用父類的指定構造器

如下圖:

Swift,init,方法初始化

這篇文章總結自以下兩篇文章

想了解更詳細的 Swift 初始化過程可作參考,建議大家創建一個 playground,跑一遍文章中的例子,能加深理解。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文日韩在线| 国产亚洲激情在线| 亚洲精品欧美日韩专区| 日韩一区二区三区xxxx| 日韩美女免费线视频| 69久久夜色精品国产69| 亚洲影院高清在线| 日韩在线免费视频观看| 日韩最新免费不卡| 久久久久久久久国产精品| 91精品中国老女人| 成人免费观看49www在线观看| 成人免费激情视频| 欧美日韩国产中字| 日韩精品中文在线观看| 欧美日韩激情视频8区| 欧美综合一区第一页| 精品国产一区二区三区久久狼黑人| 久久深夜福利免费观看| 成人乱人伦精品视频在线观看| 日韩国产精品亚洲а∨天堂免| 成人久久18免费网站图片| 91亚洲精品视频| 国产精品成人国产乱一区| 国产精品久久久久久久久久东京| 国产亚洲精品va在线观看| 国产精品久久久久影院日本| 亚洲综合中文字幕在线观看| 久久久久久久久中文字幕| 国产美女主播一区| 另类天堂视频在线观看| 亚洲精品一区久久久久久| 欧美日韩在线第一页| 欧美日韩成人免费| 欧美在线免费观看| 日韩成人av一区| 日韩最新av在线| 欧美一级成年大片在线观看| 最近中文字幕mv在线一区二区三区四区| 97**国产露脸精品国产| 国产脚交av在线一区二区| 久久久久久香蕉网| 成人激情在线播放| 97免费中文视频在线观看| 成人免费网站在线观看| 国产日韩视频在线观看| 亚洲精品视频久久| 亚洲久久久久久久久久| 国产不卡精品视男人的天堂| 精品自拍视频在线观看| 亚洲综合自拍一区| 成人激情av在线| 91视频免费在线| 狠狠操狠狠色综合网| 国产美女精品视频免费观看| 国产ts人妖一区二区三区| 国产日本欧美一区二区三区在线| 国产精品高潮呻吟久久av无限| 久久综合国产精品台湾中文娱乐网| 一区二区三区www| 亚洲成人激情图| 久热爱精品视频线路一| 亚洲性生活视频在线观看| 亚洲最新av在线| 九九久久综合网站| 亚洲欧美国产精品va在线观看| 日韩av综合网站| 国产69久久精品成人| 色综合久久精品亚洲国产| 在线视频欧美性高潮| 久久久最新网址| 国产精品v片在线观看不卡| 亚洲最大成人网色| 欧美精品videossex88| 欧美一区二区视频97| 亚洲国产精久久久久久久| 国精产品一区一区三区有限在线| 成人精品视频99在线观看免费| 久久精品91久久久久久再现| 亚洲男人天堂2024| 高跟丝袜一区二区三区| 日韩大陆毛片av| 欧美另类69精品久久久久9999| 亚洲福利在线视频| 国产精品自拍视频| 亚洲精品视频在线观看视频| 欧美精品在线观看| 欧美中文字幕第一页| 成人中心免费视频| 国产伦精品一区二区三区精品视频| 亚洲天堂成人在线| 久久成人这里只有精品| 成人免费看片视频| 国产精品扒开腿做爽爽爽视频| 久久久久久久爱| 国内外成人免费激情在线视频| 久久久女女女女999久久| 国产午夜精品免费一区二区三区| 国产精品扒开腿做爽爽爽男男| 国产精品久久久久久久久久三级| 精品久久久久久久久久久| 国模吧一区二区| 亚洲电影免费观看高清完整版| 欧美成人午夜剧场免费观看| 国产精品久久久久久久久影视| 亚洲天堂开心观看| 日本国产欧美一区二区三区| 欧美成人全部免费| 亚洲国产91精品在线观看| 久久久久这里只有精品| 亚洲第一综合天堂另类专| 亚洲第一天堂无码专区| 亚洲无限乱码一二三四麻| 精品久久久久久久久久ntr影视| 国产日韩欧美在线播放| 久久视频在线视频| 国产精品永久免费在线| 亚洲天堂男人天堂女人天堂| 九九热精品在线| 国产一区二区在线播放| 欧美国产日本在线| 最近中文字幕日韩精品| 日本午夜人人精品| 欧美午夜激情在线| 亚洲欧美国产精品| 91精品久久久久久久久久另类| 欧美日韩中文在线观看| 成人免费在线网址| 亚洲黄色在线观看| 日韩久久午夜影院| 亚洲高清不卡av| 国产精品国产亚洲伊人久久| 欧美激情一区二区三区久久久| 91九色国产社区在线观看| 欧美视频一区二区三区…| 91产国在线观看动作片喷水| 一区二区在线视频| 国产裸体写真av一区二区| 亚洲精品日韩av| 欧美巨大黑人极品精男| 日韩在线免费视频观看| 欧美日韩国产999| 国产亚洲精品成人av久久ww| 亚洲欧洲av一区二区| 日韩视频永久免费观看| 国产精品久久久久久亚洲调教| 亚洲免费中文字幕| 亚洲欧美综合另类中字| 久久久精品影院| 成人免费在线视频网站| 日韩成人在线观看| 久久免费精品视频| 国产一区二区三区视频| 91在线看www| 影音先锋日韩有码| 亚洲第一精品自拍| 亚洲天天在线日亚洲洲精| 久久久中精品2020中文| 97视频免费在线看| 亚洲最大福利视频网| 国产日韩在线播放| 国产精品美女久久久久av超清| 国产视频丨精品|在线观看| 668精品在线视频|