이전 포스팅 '프로퍼티를 초기화 하는 3가지 방법' 중에 init 메소드를 작성하는 방법이 있었다. 여기서는 init 메소드의 종류에 대해 정리하려고 한다.
이번에도 역시 유튜브 이 영상을 참고했다.
1. designated initializer
클래스의 모든 프로터피를 초기화 하는 initializer이다. 클래스 내에 초기화 되지 않은 프로퍼티가 있다면 클래스 내에 최소 한 개 이상의 designated initializer를 작성하여 프로퍼티를 초기화 해주어야 한다.
그리고 초기화가 끝나지 전에 다른 메소드를 호출할 수 없다. 다른 메소드 중에 프로퍼티에 접근하는 메소드가 있으면 어떡해,,,
2. convenience initializer
일부 프로퍼티만 초기화 하기 때문에 self.init() 처럼 이미 작성된 init 메소드를 호출해야 한다. 말 그대로 '편의'를 위한 initializer이기 때문에 이건 있어도 되고 없어도 된다.
그렇다면 무슨 '편의'를 위한 것일까? 다양한 객체를 만들 수 있도록 하려면 그만큼 여러 개의 init 메소드를 오버로딩 overloading 해야 하는데 그러면 init 메소드 내부에 중복되는 코드가 많아질 수 밖에 없다. 그래서 중복을 조금이나마 줄이기 위해 convenience initializer를 사용한다고 한다.
// 참고: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
class Food {
var name: String
var quanity: Int
init(name: String, quantity: Int) {
self.name = name
self.quanity = quantity
}
convenience init(quantity: Int) {
self.init(name: "Unnamed", quantity: quantity)
}
}
// name과 quantity를 모두 전달하여 객체를 만들거나
let myFood = Food(name: "pizza", quantity: 2)
print(myFood.name, myFood.quanity) // pizza 2
// quantity만 전달하여 객체를 만들수도 있다.
let yourFood = Food(quantity: 0)
print(yourFood.name, yourFood.quanity) // Unnamed 0
하나 더 예를 만들었는데,
enum Gender {
case Female, Male, NonBinary
}
class Person {
var name: String
var height: Double
var gender: Gender
init() {
self.name = "Unnamed"
self.height = 0.0
self.gender = Gender.NonBinary
}
init(name: String) {
self.name = name
self.height = 0.0
self.gender = Gender.NonBinary
}
}
객체를 만들 때 아무것도 넘기지 않거나 name을 넘겨서 만들 수 있도록 두 가지 init 메소드를 작성했다. init 내부에 보면 height과 gender 부분이 중복되어 있다. 이 때 convenience initializer를 사용하면 이처럼 중복된 부분을 조금은 줄일 수 있다.
class Person {
var name: String
var height: Double
var gender: Gender
init() {
self.name = "Unnamed"
self.height = 0.0
self.gender = Gender.NonBinary
}
convenience init(name: String) {
self.init()
self.name = name
}
}
3. failable initializer
https://what-whale-wants-to-say-is.tistory.com/78
[swift] failable initializer
클래스, 구조체, 열거형을 초기화 할 때 필요한 프로퍼티를 모두 제공하지 않거나 유효한 프로터피를 제공하지 않거나 아니면 다른 어떤 이유로 초기화가 실패할 수 있다. 그런 경우에 대비에
what-whale-wants-to-say-is.tistory.com
'swift & iOS > swift' 카테고리의 다른 글
[swift] for ... in 에서 배열의 인덱스로 접근하기 (0) | 2022.02.04 |
---|---|
[swift] 배열의 요소 여러 개를 한꺼번에 업데이트 하기 (0) | 2022.02.04 |
[swift] 프로퍼티 초기화 하는 방법 3가지 (0) | 2022.02.03 |
[swift] delegate 패턴 (feat. 프로토콜) & 구현해보기 (0) | 2022.02.01 |
[swift] 프로토콜 protocol (0) | 2022.01.31 |