[Swift]初期化(Initializer)-1


オブジェクトを作成するときは、初期値の生成部分と終了部分を表示します.😀
インスタンスの作成と消滅
頭文字ログインは、クラス、構造体、または列挙インスタンスを使用する初期プロセスです.
また、初期化完了後のインスタンスは使用後に消えます.
作成
初期化プロセスには、新しいインスタンスを使用する準備をするために、ストレージ・プロシージャの初期値を設定するなどが含まれます.
イニシャルliserを定義すると、初期化プロセスを直接実装できます.
class SomeClass {
    init() { ... }
}

struct SomeStruct {
    init() { ... }
}

enum SomeEnum {
    case someCase
    
    init() {
    // 열거형은 초기화할 때 반드시 case중 하나가 되어야 한다.
    	self = .someCase
    }
}
プロパティのデフォルト
構造体とクラスのインスタンスを最初に作成する場合、外部ストレージ・プロシージャは含まれません.
すべてのストレージ・アイテムに초깃값を割り当てる必要があります.
// 이니셜라이저를 이용한 할당
struct Location {
    var loaction: String
    
    init() {
        self.loaction = "KOREA"
    }
}

// 프로퍼티에 직접 할당
struct Location {
    var loaction: String = "KOREA"
}

// 옵셔널 프로퍼티 
struct Location {
    var loaction: String?
}
定数パーセント
定数として宣言されたストレージプロファイルは、インスタンスの初期化時にのみ値を割り当てることができます.
初回割当て後、値は変更できません.
class Person {
    let name: String
    
    init(name: String) {
    	self.name = name
    }
}

let fezz = Person(name: "Fezz")
fezz.name = "yagom" // Error!!
デフォルトの頭文字RiserとMemberwiseの頭文字Riser
構造体がユーザ定義の頭文字ライフサイクルを実装していない場合、
パラメータ付きの頭文字タイプライターのメンバーとIzzは、Propertyの名義で提供されます.
クラスは提供されません
struct Way {
    var left: Int = 10
    var right: Int = -5
}

let bothSide = Way(left: 20, right: 10)
// 기본값이 존재한다면 각각 지정할 수 있다.
let leftSide = Way(left: 5)
let rightSide = Way(right: 20)
委任初期化
値タイプの構造体と列挙形式は、コードの冗長性を除去します.
イニシャルタグ部分初期化を他のイニシャルタグに委任する
初期化委任を実行できます.
ただし、クラスは継承をサポートするため、初期化委任はできません.
ただし、クラスは継承された指定/便利なアルファベット登録によって類似の操作を行うことができる.
この部分は次のPost~
値タイプでは、異なるアルファベットタイプライターを呼び出す場合は、self.initを使用します.
ユーザー定義の頭文字タイプライターを定義した場合、デフォルトの頭文字タイプライターとメンバーwise頭文字タイプライターは使用できません.
したがって、フォースの初期化を行うには、少なくとも2つのカスタムヘッダライフサイクルを定義する必要があります.
基本的な頭文字アイラインがないので悲しいですか?😢
Extensionを使用して、カスタムイニシャルライフサイクルを実装できます.
enum RGBColor {
     case red, green, blue
     case white
     case none
     
     // 사용자 정의 이니셜라이저가 있는 경우, 
     // init() 메소드를 구현해야 기본 이니셜라이저를 사용할 수 있다.
     init() { 
     	self = .none
     }
     
     init(color: String) {
     	switch color {
        case "red":
            self = .red
       	case "green":
            self = .green
        case "blue":
            self = .blue
        case "redgereenblue"
            self = .white
        default:
            self = .none
        }
     }
     
     init(color: String, allSelect: Bool) {
     	self.init(color: allSelect == true ? "redgereenblue" : color)
     }
     
     var redPeople = RGBColor(color: "red")
     var whitePeople = RGBColor(color: "red", allSelect: true)
}
例題をする時ますますこじつけになりました...
要するに、委任初期化により、コードを繰り返し記述することなく、複数のcaseの頭文字ログインを効率的に作成することができる.
失敗する可能性のある頭文字Riser
インスタンスをアルファベットで初期化できない場合が多い.
代表的には、頭文字の伝達パラメータとして誤った値や不適切な値が伝達される場合がある.
失敗する可能性のある頭文字Liserは、クラス、構造体列挙型などとして定義できます.
失敗した可能性のあるイニシャルタイプライターは、失敗した場合にnilが返されるので、返却タイプです.
実際には、失敗する可能性のあるアルファベットを使用してログインしなくても、不適切な値が受信されます.
エラーは単独で処理できるが、より簡潔に処理できるという利点がある.
enum RGBColor: String {
     case red = "빨강"
     case green = "초록"
     case blue = "파랑"
     case white = "흰"
     
     init?(color: String) {
     	switch color {
        case "red":
            self = .red
       	case "green":
            self = .green
        case "blue":
            self = .blue
        case "redgereenblue"
            self = .white
        default:
            return nil
        }
     }
     
     init?(color: String, allSelect: Bool) {
     	self.init(color: allSelect == true ? "redgereenblue" : color)
     }
     
     var people1 = RGBColor(color: "pink") // nil
     var people2 = RGBColor(color: "orange", allSelect: false) // nil
     var people3 = RGBColor(rawValue: "BlackPink") // nil
     var people4 = RGBColor(rawVlue: "white") // white
}
失敗する可能性のあるアルファベット手書きの例として、ますます奇妙な例が使用されています.
最初のアルファベットログインが不適切な値で呼び出されると、nilが返されます.
インスタンスの消失
クラスのインスタンスは、イニシエータ(Deinitializer)を実装できます.
アルファベットライターとアルファベットライターは反対のキャラクターで、
クラスインスタンスをクリーンアップして、クラスインスタンスが解放される前にクリーンアップできます.
略語はクラスのインスタンスでのみ実現できます.
class SomeClass {
    deinit { ... }
}

var instance = SomeClass()
instance = nil 
📄 リファレンス
[図書]SWIFTプログラミング3版-野熊