最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift中初始化init的方法小結(jié)

 更新時間:2018年04月27日 08:33:46   作者:yanging  
Swift有著超級嚴格的初始化方法,不僅強化了designated初始化方法的地位,所有不加修飾的init方法都需要在方法中確保非Optional的實例變量被賦值初始化,下面這篇文章主要給大家介紹了關(guān)于Swift中初始化init的相關(guān)資料,需要的朋友可以參考下。

前言

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

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

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

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

結(jié)構(gòu)體初始化

如果結(jié)構(gòu)體沒有實現(xiàn)任何初始化函數(shù),Swift 默認給生成一個包含所有成員變量的初始化構(gòu)造器。

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

如果使用如下的代碼初始化這個結(jié)構(gòu)體:

let athena9Heavy = RocketConfiguration()

將產(chǎn)生編譯錯誤,如下圖:


有兩種做法可以消除錯誤,聲明結(jié)構(gòu)體成員時即賦值,如下:

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。或者使用默認的初始化構(gòu)造器,給每個成員賦一個初始化的值:

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)

類的初始化

和結(jié)構(gòu)體不同的是,類必須自己聲明初始化構(gòu)造器:

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

如果去掉上面的init函數(shù),將產(chǎn)生編譯錯誤,如下圖:


指定構(gòu)造器(Designated Initializers)

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

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
 }
} 

初始化調(diào)用:

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

便利構(gòu)造器(Convenience Initializers)

便利構(gòu)造器是在init前加一個關(guān)鍵子convenience,它為一些屬性提供默認值:

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

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

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

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


子類的初始化

class Tank: RocketComponent {
 let encasingMaterial: String
}

這段代碼會產(chǎn)生編譯錯誤:


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

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

或者聲明一個指定構(gòu)造器:

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")

需要注意的是,子類自身屬性的初始化需要在調(diào)用父類的初始化構(gòu)造器前完成,如下代碼

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

將產(chǎn)生編譯錯誤,如下圖:


父類屬性的初始化,需要在調(diào)用父類構(gòu)造器之后:如下:

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

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


初始化調(diào)用順序

  • 便利構(gòu)造器需要調(diào)用類自身的便利構(gòu)造器或指定構(gòu)造器,最終要調(diào)用類自身的指定構(gòu)造器。
  • 子類的指定構(gòu)造器需要調(diào)用父類的指定構(gòu)造器

如下圖:


這篇文章總結(jié)自以下兩篇文章

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

總結(jié)

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

相關(guān)文章

  • 詳解Swift中的函數(shù)及函數(shù)閉包使用

    詳解Swift中的函數(shù)及函數(shù)閉包使用

    Swift的函數(shù)在創(chuàng)建和調(diào)用時非常簡潔,在編寫具有閉包特性的函數(shù)時同樣也相當方便,以下我們就來詳解Swift中的函數(shù)及函數(shù)閉包使用:
    2016-06-06
  • mac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時,出現(xiàn)了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助
    2014-09-09
  • Swift語言中字符串相關(guān)的基本概念解析

    Swift語言中字符串相關(guān)的基本概念解析

    這篇文章主要介紹了Swift語言中字符串相關(guān)的基本概念解析,是Swift入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Swift?Error重構(gòu)優(yōu)化詳解

    Swift?Error重構(gòu)優(yōu)化詳解

    這篇文章主要為大家介紹了Swift?Error的問題解決及重構(gòu)優(yōu)化方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 蘋果公司編程語言Swift語言簡介

    蘋果公司編程語言Swift語言簡介

    這篇文章主要介紹了蘋果公司編程語言Swift語言簡介,Swift 是一門新的編程語言,兼容Objective-C代碼,是用來代替Objective-C的蘋果主力開發(fā)語言,需要的朋友可以參考下
    2014-07-07
  • Swift實現(xiàn)快速排序算法的代碼示例

    Swift實現(xiàn)快速排序算法的代碼示例

    這篇文章主要介紹了Swift實現(xiàn)快速排序算法的代碼示例,首先利用分治法講解了快速排序的思路,需要的朋友可以參考下
    2016-07-07
  • Swift之UITabBarController 導航控制器的自定義

    Swift之UITabBarController 導航控制器的自定義

    本文給大家介紹swift導航控制器之UITabBarController,本文通過代碼實例給大家講解swift導航控制器,導航控制器類繼承UITabBarController,代碼簡單易懂,需要的朋友可以參考下
    2015-10-10
  • 使用Swift實現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程

    使用Swift實現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程

    這篇文章主要介紹了使用Swift實現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程,講到了iOS中提供的NSXMLParser和NSXMLParserDelegate兩個API的用法,需要的朋友可以參考下
    2016-04-04
  • Swift在什么情況會發(fā)生內(nèi)存訪問沖突詳解

    Swift在什么情況會發(fā)生內(nèi)存訪問沖突詳解

    這篇文章主要給大家介紹了關(guān)于Swift在什么情況會發(fā)生內(nèi)存訪問沖突的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • swift3.0指紋解鎖的實現(xiàn)方法

    swift3.0指紋解鎖的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了swift3.0指紋解鎖的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

南通市| 望城县| 乐昌市| 大同市| 金堂县| 鄯善县| 双柏县| 从江县| 石台县| 常山县| 永年县| 和硕县| 湘乡市| 宣威市| 日土县| 大连市| 类乌齐县| 含山县| 台南县| 德保县| 开鲁县| 独山县| 墨江| 济阳县| 扬州市| 上蔡县| 邮箱| 盘锦市| 利津县| 梁山县| 岳池县| 手游| 乡宁县| 扎鲁特旗| 彭山县| 盐亭县| 云安县| 济源市| 静海县| 山东| 呈贡县|