Initializers in Swift Class

深刻理解代替單純記憶安全

  1. Swift初始化時會想盡一切辦法確保初始化的安全、完備bash

  2. 就兩種初始化方法:designated initializerconvenience initializeride

  3. designated方法是指當前類完成初始化最基礎的方法,它能知足全部stored property的初始化賦值ui

  4. 初始化方法中必須保證全部stored property都被賦上初始值。固然,optional的屬性能夠不用明顯的寫出,默認會賦值爲nilspa

  5. Swift初始化方法,子類通常不會將父類的方法繼承下來。爲的就是,一旦能夠繼承的話,那咱們就能夠用父類的方法初始化一個子類對象了,此時子類的對象的屬性可能並不okcode

    class Food {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    class Noodle: Food {
        let width: CGFloat
        init(width: CGFloat) {
            self.width = width
            super.init(name: "Noodle")
        }
    }
    複製代碼
  6. 固然,上面所說是指通常狀況,有些狀況下子類仍是會繼承父類的方法的cdn

    • 就是子類沒有自定義designated initializer時,哪怕並子類並無增長stored property的狀況下,依然不能繼承父類初始化方法。由於自定義initializer初始化方法中除了爲stored property賦值,可能還有其餘自定義操做,既然寫了designated initializer方法,就說明可能有本身的實現,此時再繼承了父類的實現就觸發4中的問題了
    class Food {
        var name: String
        init(name: String) {
            self.name = name
        }
        convenience init() {
            self.init(name: "unknown")
        }
    }
    class Noodle: Food {
    }
    let var1 = Noodle()
    let var2 = Noodle(name: "noddle")
    複製代碼
  7. 一個複雜點的例子對象

    • Food是父類,RecipeIngredient是子類
    • 子類自定義實現了一個designated initializer,又重寫了一個父類的designated initializer同時用做convenience initializer
    • 該狀況下,父類的convenience init()方法會自動繼承到子類中,由於子類實現了全部的的父類的designated initializer,因此父類的convenience initializer自動繼承下來仍然會保證初始化的完備性

  8. 接着上面的例子,再來一層blog

    • ShoppingListItem做爲更子的類,因爲引入的purchased屬性有默認值,因此會自動繼承父類的各類初始化方法,由於繼承下來不會影響初始化的完備性

簡單總結

仍是那句話,爲了確保初始化的完備性,能繼承下去的就繼承,一旦發現有影響完備性的漏洞,就不容許繼承繼承

  • convenience initializer只能訪問本類的初始化方法爲此目的
  • designated initializer只能執行父類的designated initializer也是如此
  • 全部規則都是如此;不記規則,只看原則

疑問

  1. 一方面Swift的子類不能繼承父類的初始化方法,另外一方面,子類在重寫父類的初始化方法時卻仍要寫上override,這點不是很理解
    • 若是不能繼承父類初始化方法,那子類實現和父類一致的初始化方法時照理應該理解爲定義了一個全新的初始化方法,而非真的重寫了
相關文章
相關標籤/搜索