생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거하고, 모든 프로퍼티를 효율적으로 초기화 하기위해 사용하는 것! 값타입과 참조타입을 나눠서 설명하겠당!
아래 코드는 모든 프로퍼티 x, y값을 초기화 하는 코드를 두 곳 모두에서 작성하고 있으니
=> 중복된 코드 => Initializer Delegation을 따르고 있지 않음!
물론 이렇게 작성해도 이상할거 하나 없지만 중복을 줄이면서 유지보수가 좋은 방향으로 코드를 구현하는것이 또 개발자의 낭만 아니겠습니까~?~?
struct Position {
var X: Int
var Y: Int
init(xPos: Int, yPos: Int) {
x = xPos
y = yPos
}
init(pos: Int) {
x = pos
y = pos
}
}
생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거!
코드로 보면 바로 아~ 할것임
struct Position {
var X: Int
var Y: Int
init(xPos: Int, yPos: Int) {
x = xPos
y = yPos
}
init(pos: Int) {
self.init(xPos: pos, yPos: pos)
}
}
값 타입과 똑같지만! 3가지 규칙을 지켜야 한다!
하지만 앞에서 다 배운것들이야! 걱정하지마!
- init 함수가 끝나기 전에 모든 프로퍼티의 값이 초기화 되어있어야 한다!
- 서브 클래스인 경우, super 클래스의 init 메서드를 반드시 호출 해줘야 한다!
- Designated Initializers의 초기화를 보조해주는 역할
- 파라미터 중 일부를 기본값으로 설정해서 호출할 수 있따!
- 반드시 같은 클래스 계층 내에 있는 Designated Initializers가 호출되어야 한다!
Designated Initializer는 반드시 슈퍼클래스의 Designated Initializer를 호출해야 한다!
Convenience Initializer는 반드시 동일한 계층의 initailizer를 호출해야 한다!
Convenience Initializer는 최종적으로 동일한 계층의 Designated initialize를 호출해야 한다!
class Figure {
let name: String
init(name: String) {
self.name = name
}
// Delegate Across
convenience init() {
self.init(name: "unknown")
}
}
class Rectangle: Figure {
var width = 0.0
var height = 0.0
// Delegate Up
init(n: String, w:Double, h: DOuble){
weidth = w
height = h
super.init(name: n)
}
// Delegate Across
convenience init(value: Double) {
self. init(n: "rect", w: value, h: value) // initialize Delegate
}
}
class square: Rectangle {
convenience init(value: Double) {
self.init(m: "square", w: value, h: value)
}
convenience init() {
self.init(value: 0.0)
}
}