Class - Initialization


初期化は、各propertyの初期値を設定するためにクラス、構造体、および列挙インスタンスを使用する準備をするステップです.
以前は、宣言で簡単に初期化しただけでしたが、initコードを見たとき、少し怖かったようです.
これはいくつかのルールや順序を理解するのに良い時間です.

Syntax

class SomeClass {
		init() {
		}
}

Default Property Values


プロパティを宣言しながらinitではなく初期値として値を指定できます.
struct SomeStruct {
		var someProperty = 32.0
		
		//구현하지 않아도 됨
		init(property: Double) {
				self.someProperty = property
		}
}

Customizing initialization


初期化パラメータ値と割当てをカスタマイズできます.
struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)

Optional Property types


Propertyがオープンタイプの場合、initプロセスで値が追加されていない場合はnilが自動的に割り当てられます.
var optionalValue: Int? = これをする必要はありません

Assigning Constants Properties During Initialization


初期化中に定数プロシージャに値を割り当てることができます.
class SurveyQuestion {
    let text: String
    var response: String?
    init(text: String) {
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// Prints "How about beets?"

Default Initializers(class/struct)


すべての初期値は
  • に設定されています.
  • カスタムイニシエータなし
    上記の場合、SWIFTはデフォルトのイニシエータを自動的に提供し、初期化を簡略化することができる.
  • class ShoppingListItem {
        var name: String?
        var quantity = 1
        var purchased = false
    }
    var item = ShoppingListItem()

    Initializer Delegation for Value Types


    イニシャルタイプライターから他のイニシャルタイプライターを呼び出します.
    すぐに値を割り当てて初期化します.
    以下に示すことができる.
    struct Size {
        var width = 0.0, height = 0.0
    }
    struct Point {
        var x = 0.0, y = 0.0
    }
    
    struct Rect {
        var origin = Point()
        var size = Size()
        init() {}
        init(origin: Point, size: Size) {
            self.origin = origin
            self.size = size
        }
        init(center: Point, size: Size) {
            let originX = center.x - (size.width / 2)
            let originY = center.y - (size.height / 2)
    		//아래의 self.init은 origin과 size의 할당을 위임한다는 의미
            //말이 어려워서 그렇지만... 그냥 다른 init 호출해서 쓰는게 가능하다는 걸로 이해
            self.init(origin: Point(x: originX, y: originY), size: size)
        }
    }
    
    let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
                          size: Size(width: 3.0, height: 3.0))

    Class Inheritance and Initialization


    クラスには継承関係があり、SuperClassとの関係が少し複雑になっています.
    これからinitのルールは?同じ内容.つまらないけど、理解して理解すればいい.
    すべてのクラスのpropertyとスーパークラスのすべてのpropertyは、初期に値を設定し、2つの方法を提供する必要があります.(クラス内のinit間のルール)
  • Designated Initializers and Convenience Initializers
  • Designed Initializersは、すべてのPropertiesを初期化するためのクラスの頭文字の略語中断の主な構文です.クラスには少なくとも1つの設計イニシエータが必要です.
  • 「イニシエータを容易にする」は、予め指定された値を使用して初期化され、最小限の入力で初期化できます.便利な起動者は、他のイニシエータを呼び出す必要があります.
  • //Designated Initializer
    init(params) {
    	//초기화
    }
    
    //Convenience Initializer
    convenience init(params) {
    	//초기화
    }
  • Initializer Delegation for Class Types
    設計イニシエータと構成イニシエータの間の委任関係を簡略化するには、次の3つのルールがあります.
  • 設計初期化器は、スーパークラスの設計初期化器を初期化しなければならない.
  • イニシエータは、他のイニシエータを呼び出す必要があります.
  • イニシエータは、最終的に設計イニシエータを呼び出す必要がある.
  • 絵は複雑ですが、文字を理解していれば見やすいです.
  • デュアルフェーズ初期化(init内部のルール)
    SWIFTでは、初期化は2つのステップで行われる.
  • ステップ1
    呼び出し
  • 初期化器
  • サブクラスのすべてのプロパティを初期化し、スーパークラス初期化
  • を行う.
  • の最上位レベルのすべてのプロパティ値を確認し、
  • の初期化を完了します.
    ステップ2
  • トップクラスのinitが終了してからselfを有効にします.
  • 以降のサブクラスの指定init
  • 以降は、便利なinit順でサブクラス
  • を使用することができる.
    swiftは、上記の2つのプロセスのセキュリティを確保するための4つのルールを提供します.ルールを守らないとコンパイルエラーが発生します
  • Designated initは、現在のクラスのpropertyを指定する必要があります.
  • 設計のinitは、継承されたpropertyに割り当てる前にスーパークラスinit
  • が必要である.
  • Convenence initは、すべてのPropertyに割り当てる前に他の初期化器を実行する必要があります.(2番目のルールと同様の親initを使用)
  • ステップ1のプロセスの前に、任意の方法またはpropertyにアクセスすることによって取得することはできない.
  • Initializer Inheritance and Overriding
    デフォルトでは、sub-classはsuper-class initを継承しません.
    継承関係が複雑になったときにエラーの初期化を防止します.
  • 安全かつ特定の場合にはオーバーシュートが可能であり、以下の例では可能である.
    class Vehicle {
        var numberOfWheels = 0
        var description: String {
            return "\(numberOfWheels) wheel(s)"
        }
    		//정의 시점에 모든 프로퍼티가 할당될 값이 지정된다면 자동 initializer가 생성된다.
    }
    
    class Bicycle: Vehicle {
        override init() {
            super.init()
            numberOfWheels = 2
        }
    }
    
    let bicycle = Bicycle()

    Failable Initializers


  • Propagation of Initialization Failure
    init? に示すように、実装は失敗する可能性のあるイニシエータとなり、nilに戻ることができます.

  • Overriding a Failable Initializer
    失敗する可能性のあるプロモーターを上書きし、失敗しないプロモーターにします.
    class Document {
        var name: String?
        // this initializer creates a document with a nil name value
        init() {}
        // this initializer creates a document with a nonempty name value
        init?(name: String) {
            if name.isEmpty { return nil }
            self.name = name
        }
    }
    
    class AutomaticallyNamedDocument: Document {
        override init() {
            super.init()
            self.name = "[Untitled]"
        }
        override init(name: String) {
            super.init()
            if name.isEmpty {
                self.name = "[Untitled]"
            } else {
                self.name = name
            }
        }
    }

  • init!
    失敗する可能性のあるイニシエータを強制的にアンインストールすることで、上書きすることもできます.
    		```
    		class UntitledDocument: Document {
    	  override init() {
    super.init(name: "[Untitled]")!
    }
    		}
    		```

    Required Initializers


    すべてのサブクラスで実装する必要がある初期サブクラスについては、次の必須キーワードを使用して実装できます.
    		```
    		class SomeClass {
    required init() {
    //initializer implementation goes here
    }
    }
    		```
    #学習内容に誤りがある可能性があります.
    コメントに書くともっと良い投稿で修正されます