이니셜라이저 델리게이션
이니셜라이저 안에 다른 이니셜라이저를 호출하는 것
초기화 코드에서 중복을 최대한 제거하고 모든 속성을 효율적으로 초기화 하기 위해서 사용한다.
값형식과 참조형식에서 서로 다른 규칙으로 구현된다.
값형식은 상속 불가 이니셜라이저 하나기때문에 상대적으로 단순함
값 형식
커스텀 이니셜라이저 안에서 self.init으로 다른이니셜라이저 호출가능
```swift
struct Test {
var first: String
var second: String
init(value1: String, value2: String) {
first = value1
second = value2
}
init(value: String) {
self.init(value1: value, value2: value)
}
}
```
class
상속 계층을 따라 올라가면서 모든 이니셜라이저가 올바른 순서로 호출되도록 구현하는것이 중요
```swift
class First {
var first: String
init(name: String) {
first = name
}
}
class Second: First {
var second = 0
var three = 0
init(n: String, value1: Int, value2: Int) {
second = value1
three = value2
super.init(name: n) // 델리게이트 업 1번 규칙
}
convenience init(value: Int) {
self.init(n:"hello", value1: value, value2: value) // 델리게이트 어크로스
}
}
// 델리게이트 어크로스
class Three: Second {
// 속성이 선언되어있지 않음
// 이 경우에는 세컨드 클래스의 지정생성자가 상속됨
// 상속받은 세컨드 클래스의 지정생성자를 호출하기때문에 self를 사용
// 컨비니언스는 델리게이션 업 불가능함
convenience init(value: Int) {
self.init(n:"Swift", value1: value, value2: value)
}
//
convenience init() {
self.init(value: 10)
}
}
var test = Three(value: 20)
test.first
test.second
test.three
```
참조 형식
<Swift가 정한 3가지 규칙 - 무조건 해야 함. 필수>
지정 이니셜라이저 안에서, 바로 위 슈퍼클래스의 지정 이니셜라이저를 호출 - 델리게이트 업
편의 이니셜라이저 안에서, 같은 클래스 내의 지정 이니셜라이저를 호출 - 델리게이트 어크로스
편의 이니셜라이저 안에서, 마지막에는 지정 이니셜라이저를 호출
'Swift > Swift문법' 카테고리의 다른 글
| Swift문법 - required initializers (0) | 2023.05.14 |
|---|---|
| Swift문법 - Class Initializer (0) | 2023.05.07 |
| Swift문법 - Memberwise Initialer (0) | 2023.04.30 |
| Swift문법 - Inheritance (1) | 2023.04.23 |
| Swift문법 - Method (0) | 2023.04.16 |