| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 뷰를그리는메서드
- 다이나믹링크분석
- XCUITest
- displayscale
- cgimage
- Architecture
- applaucnchprocess
- swift6
- SPM
- mangle
- updatecycle
- Swift
- 뷰의레이아웃을계산하는메서드
- UIKit
- modulararchitecture
- mach-o파일분석
- IOS
- WWDC24
- actor
- ios바이너리분석
- uicollectionview
- xcrun swift-demangle
- 이진삽입정렬
- Xcode
- ciimage
- mainrunloop
- swift-demangle
- swift6.1
- swiftconcurrency
- task
- Today
- Total
꾸준한 기록
[Initializer] Default Initializer, Designated Initializer, Convenience Initializer 본문
[Initializer] Default Initializer, Designated Initializer, Convenience Initializer
Doo혀니 2023. 11. 8. 22:24Default Initializer
- class와 struct의 모든 프로퍼티가 기본 값 가지고 아무런 intializer 없으면, default initializer가 제공된다.
Class의 Initializer: Designated Initializer & Convenience Initializer
Intializer에서 모든 프로퍼티가 초기화되도록 하기 위해, Swift는 class에 2가지 종류의 Initalizer 제공한다.
Designated Initializer
- 기본 이니셜라이저.
- 적어도 1개의 designated Initializer 꼭 필요.
- 모든 프로퍼티를 초기화한 후에 슈퍼 클래스의 이니셜라이저를 호출해야 함.
init(<#parameters#>) {
<#statements#>
}
Convenience Initializer
- 보조 이니셜라이저.
- 필요없다면 정의하지 않아도 됨.
- designated initializer의 매개변수 중 일부에 기본값 지정 가능.
- 특정 상황마다 동일한 매개변수 값을 가지고 Intializer를 호출하는 경우, convenience initializer를 이용해 편리하게 사용 가능.
convenience init(<#parameters#>) {
<#statements#>
}
class 상속관계에서 Designated Initializer, Convenience Initializer 규칙
class를 상속하여, parent class와 child class가 존재할 때 다음 규칙을 지켜야 한다.
1. child class 의 designated initializer는 parent class의 designated initializer를 반드시 호출해야 함.
2. convenience initializer는 같은 class의 다른 initializer를 무조건 호출해야 함.
3. convenience intializer는 최종적으로 designated initializer를 호출해야 함.

규칙 3번에 대해서 부연 설명하기 위해 Swift 공식문서에 있는 그림을 가지고 왔다.
그림에서 superclass의 convenience initializer는 다른 convenience initializer를 호출하고, 이 이니셜라이저는 다시 designated initizlier를 호출한다. 이렇듯 convenience intializer로 부터 시작되어 연쇄적으로 initializer가 호출되는데, 가장 마지막에 호출되는 initialzier는 최종적으로 designated initializer가 되어야 한다. subclass의 경우도 마찬가지다. child의 convenience initializer ➡️ child의 designated initializer ➡️ parent의 designated initialzer 순으로 호출되어, child 와 parent 의 designated initializer가 반드시 호출된다.
'Swift' 카테고리의 다른 글
| [Concurrency] DispatchQueue.main.async 를 대체하는 방법 (0) | 2024.08.27 |
|---|---|
| [Swift 6] Typed Throws (0) | 2024.08.21 |
| Swift 6 의 새로운 기능 (0) | 2024.06.11 |
| [WWDC23] Meet SwiftData (1) | 2023.11.02 |
| [Combine] Publisher, Subscriber, Operator (0) | 2022.03.28 |