Reference
- 내용전반 : SwiftLanguageGuide
class Person {
let name: String
var age: Int
init(name: String) {
self.name = name
self.age = 10
}
}
class Employee: Person {
var salary: Int
init(name: String) {
self.salary = 10 // 1. 자신의 프로퍼티 초기화
super.init(name: name) // 1. super의 Designated 호출
self.age = 20 // 2. super의 프로퍼티 변경
}
convenience init() {
self.init(name: "김씨") // 3. Designated부터 호출
self.salary = 20 // 3. 프로퍼티 변경
}
}
Designated 생성자에서, 프로퍼티를 초기화해주고 super.init을 호출할 것
super의 프로퍼티를 변경하려면, super.init 이후에 해줄 것 (overwrite 방지)
convenience에서 프로퍼티를 변경하려면, Designated 생성자 호출 이후에 변경할 것 (overwrite 방지)
모든 stored 프로퍼티가 초기화 된 이후부터 프로퍼티/메서드 사용이 가능하다
여기에 더 잘 정리해놓았다. 과거의 나 칭찬해..
Swift에서 생성자는 다른 일반 메서드와 달리 특정 조건을 만족시켜야만 상속이 된다. 생성자 상속과 관련한 2가지 Rule이 있다
🔘 Rule 1 : 자식 class에 Designated가 하나도 없는 경우
🔘 Rule 2 : 자식 class에 부모의 모든 Designated를 구현하면
부모의 생성자를 override하는데 있어 2가지 규칙이 있다
class ABC {
var a: Int
init() {
self.a = 1
}
}
class DEF: ABC {
let b: Int
override init() {
self.b = 2 // self의 프로퍼티부터 초기화
super.init()
self.a = 2 // super의 프로퍼티 변경은 super.init 호출 이후부터 가능
}
}
이를 생략할 수 있는 특수한 경우가 있는데, 아래 조건을 만족해야 한다. 이 두 조건을 만족할 경우 super.init()이 마지막줄에 암시적으로 호출되어 생략할 수 있다
class ABC {
let a: Int
init() {
self.a = 1
}
//기본생성자 외 다른 생성자가 있으면 안됨
}
class DEF: ABC {
let b: Int
init(b: Int) {
self.b = 2
//super의 프로퍼티를 변경하지 않는 경우
//super.init() 생략가능
}
}