초기화 위임
값 타입인 구조체 및 열거형은 코드의 중복을 피하기 위할 목적으로
이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임할 수 있음
enum Student {
case ele, mid, high
case none
init(koreanAge: Int) {
switch koreanAge {
case 8...13:
self = .ele
case 14...16:
self = .mid
case 17...19:
self = .high
default:
self = .none
}
}
init(bornAt: Int, currentYear: Int) {
self.init(koreanAge: currentYear - bornAt + 1)
}
}
var jerry: Student = Student(koreanAge: 16)
print(jerry) // mid
jerry = Student(bornAt: 1999, currentYear: 2023)
print(jerry) // none
위의 열거형은 2개의 사용자 정의 이니셜라이저가 있음
첫 번째 이니셜라이저는 koreanAge를 전달받아 나이에 맞는 학교를
case로 구분한 이니셜라이저로 초기화
init(koreanAge: Int) {
.....
}
두 번째 이니셜라이저는 태어난 해와 현재 연도를 전달받아 나이로 계산한 후
첫 번째 이니셜라이저로 초기화를 위임함
만약에 "초기화 위임"을 사용하지 않는다면?
두 번째 이니셜라이저에도 첫 번째 이니셜라이저와 마찬가지로
koreanAge에 해당하는 switch 구문을 또 만들어야 하는 번거로움 발생함
init(bornAt: Int, currentYear: Int) {
self.init(koreanAge: currentYear - bornAt + 1)
}
여기 Money 구조체가 있음
안에는 2개의 저장 프로퍼티가 있고,
해당 프로퍼티를 초기화하는 코드가
2곳에 작성되어 있음 (중복된 코드)
struct Money {
var myMoney: Int
var yourMoney: Int
init(myMoney: Int, yourMoney: Int) {
self.myMoney = myMoney
self.yourMoney = yourMoney
}
init(ourMoney: Int) {
self.myMoney = ourMoney
self.yourMoney = ourMoney
}
}
여기서 만약에 yourMoney 변수의 값을 특정 값으로 초기화하려고 한다면?
struct Money {
var myMoney: Int
var yourMoney: Int
init(myMoney: Int, yourMoney: Int) {
self.myMoney = myMoney
self.yourMoney = 1000
}
init(ourMoney: Int) {
self.myMoney = ourMoney
self.yourMoney = 1000
}
}
이니셜라이저 2곳 모두 값을 변경해주어야 하는 번거러움 있음
따라서 위의 코드에 "초기화 위임"을 써본다면?
아래 코드처럼 모든 프로퍼티를 초기화하는 첫 번째 이니셜라이저를 생성한 후
두 번째 이니셜라이저가 이를 이용하도록 만듦
struct Money {
var myMoney: Int
var yourMoney: Int
init(myMoney: Int, yourMoney: Int) {
self.myMoney = myMoney
self.yourMoney = 1000
}
init(ourMoney: Int) {
self.init(myMoney: ourMoney, yourMoney: ourMoney)
}
}
'iOS > Swift' 카테고리의 다른 글
인스턴스 생성 및 소멸 5편 (함수를 사용한 프로퍼티 기본값 설정) (0) | 2024.02.01 |
---|---|
인스턴스 생성 및 소멸 4편 (실패 가능한 이니셜라이저) (0) | 2024.01.31 |
인스턴스 생성 및 소멸 2편 (0) | 2024.01.30 |
인스턴스 생성 및 소멸 1편 (0) | 2024.01.29 |
메서드 (0) | 2024.01.26 |