[Swift5] Initialization 2


  • 以下はSWIFT 5.6 DocのInitialization学習内容のまとめです.
  • Initialization


    クラス継承と初期化


    クラス継承のすべての構成を含むすべてのクラスストレージ構成は、初期化によって初期値を割り当てる必要があります.クラスタイプを初期化して、すべてのストレージ・プロシージャが初期値を受け入れるようにするには、2つの方法があります.指定された頭文字ライター(designated initializers)と便利な頭文字ライター(convenience initializers)です.

    指定した頭文字Riserと便利な頭文字Riser

  • で指定された頭文字ログイン:クラス内のすべてのプログラムを初期化し、親クラスの初期化に必要な頭文字ログインを呼び出します.
  • すべてのカテゴリには、少なくとも1つの指定された頭文字平信が存在します.(親から指定されたニックシェリーを1つ以上継承する場合)
  • 便利な頭文字登録:クラスの頭文字登録をサポートします.便利な頭文字ライターを使用して、頭文字ライターのパラメータを指定するデフォルト値を設定し、指定した頭文字ライターを呼び出します.クラスインスタンスの作成時に呼び出されます.
  • サポートされていなければ、便利なアルファベットタイプライターを使わなくてもいいです.

    大文字の構文


    指定した頭文字Riser構文は次のとおりです.
    init(parameters) {
        statements
    }
    initキーワードの前にconvenienceキーワードを付けると便利な頭文字になります.
    convenience init(parameters) {
        statements
    }

    クラスヘッダ表記規則


    iニクソン遅延を呼び出すには3つのルールがあります.
  • で指定した頭文字タイプライターは、親の指定した頭文字タイプライターを呼び出す必要があります.
  • 便利なアルファベットタイプライターは、同じレベルの他のアルファベットタイプライターを呼び出す必要があります.
  • 便利なアルファベットタイプライターは、最終的に指定されたアルファベットタイプライターを呼び出す.
  • これはクラスの頭文字Liserの使用方法にのみ影響します.

    2つのステップを初期化


    クラスの初期化には2つの段階があります.
  • がpropertyを格納するクラス割当初期値.
  • 各クラスは、ストアド・プロシージャ値をカスタマイズできます.
  • 親と子の境界を保護し、初期化の安全を確保できます.スウィフトは4段階に分けて安全を確認した.
  • で指定した頭文字でログインし、クラス内のすべてのproperty値を初期化します.
  • で指定した頭文字ログインで継承されたアイテムに値を割り当てる前に、親の頭文字ログインを遅延する必要があります.
  • の便利なアルファベット平価がproperty値に割り当てられる前に、他のアルファベット平価で遅延する必要があります.
  • の頭文字ライフサイクルでは、インスタンスメソッドを呼び出したり、インスタンス値を読み出したり、初期化の最初のステップが完了した後に自分を値として参照したりすることはできません.
  • 初期化手順1


    クラスクリップまたは便利な頭文字Riserを呼び出すと、新しいインスタンスにメモリが割り当てられます.メモリが初期化されていません.
    指定した頭文字ライフサイクルを使用すると、ストレージ・プロシージャの値が割り当てられます(メモリが初期化されます).指定したイニシャル・ログイン・プログラムは、親イニシャル・ログイン・プログラムを呼び出し、上位ストレージ・プログラムに対して同じ操作を実行します.すなわち、最初に指定したアルファベットタグを呼び出すクラスは、継承されたクラスでも独自のpropertyでも、すべてのpropertyを初期化します.

    ステップ2初期化


    指定した頭文字ログインでインスタンスをカスタマイズできます.すなわち、property値を変更したり、インスタンスメソッドを呼び出したりするには、頭文字タグで自分を参照することができます.便利な頭文字アイラインペンもカスタマイズに使用されます.第2段階初期化で使用される頭文字の順序は(上位親の指定頭文字の順序→...→現在のクラスの指定頭文字の順序→現在のクラスの便利な頭文字の順序)である.

    イニシャルタグの継承と上書き


    sweeftのサブクラスは、親クラスの頭文字liserを自動的に継承しません.親レベルの頭文字が安全で適切な場合にのみ継承されます.親の頭文字lighterをoverlightingで継承します.注意、オートオーバーシュート時にもキーワードを使います.
    子クラスが親クラスの便利な頭文字タグを呼び出す場合は、子クラスを間接的に呼び出す必要がありますが、上書きキーは作成されません.
    class Vehicle {
        var numberOfWheels = 0
        var description: String {
            return "\(numberOfWheels) wheel(s)"
        }
    }
    
    let vehicle = Vehicle()
    print("Vehicle: \(vehicle.description)")
    // Vehicle: 0 wheel(s)
    The next example defines a subclass of Vehicle called Bicycle:
    
    class Bicycle: Vehicle {
        override init() {
            super.init()
            numberOfWheels = 2
        }
    }
    
    let bicycle = Bicycle()
    print("Bicycle: \(bicycle.description)")
    // Bicycle: 2 wheel(s)
    
    class Hoverboard: Vehicle {
        var color: String
        init(color: String) {
            self.color = color
            // super.init() implicitly called here
        }
        override var description: String {
            return "\(super.description) in a beautiful \(color)"
        }
    }
    An instance of Hoverboard uses the default number of wheels supplied by the Vehicle initializer.
    
    let hoverboard = Hoverboard(color: "silver")
    print("Hoverboard: \(hoverboard.description)")
    // Hoverboard: 0 wheel(s) in a beautiful silver
    Vehicleレベルではカスタムの頭文字Riserはありませんので、デフォルトの頭文字Liserを使用します.BicycleクラスはVehicleクラスを継承するサブクラスで、Custom頭文字Liserを使用します.superを通過し、残りはそのまま持っていった.Hoverboardはcustom頭文字liserを用いながらoverridingも行われた.super.init()が自動的に使用されています.
    サブクラスは、継承された変数プロファイルを置き換えることができますが、定数プロファイルを置き換えることはできません.