안녕하세요 공부하는 개발자 입니다.
오늘 포스팅은 저번에 마저 하지 못한 생성자 후속 입니다.
⚙️Required Initializer 필수 생성자
필수 생성자란 superClass에서 반드시 재정의를 해달라고 표시해두는 것을 의미합니다.
1
2
3
4
5
6
7
8
9
10
11
|
class Figure {
var name: String
required init(name: String) {
self.name = name
}
func draw() {
print("draw \(name)")
}
}
|
cs |
만약 위와 같은 생성자를 가지고 있는 superclass를 선언하였습니다.
생성자 앞에 required를 선언하여 만약 상속을 한다면 이 부분을 정의해달라고 표시를 해두는 것이죠.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Rectangle: Figure {
var width = 0.0
var height = 0.0
init(){
width = 0.0
height = 0.0
super.init(name: "unknown")
}
required init(name: String){
width = 0.0
height = 0.0
super.init(name: name)
}
}
|
cs |
그렇기 때문에 superclass인 Figure를 상속받는 Rectangle의 경우에는 반듯이 required init부분을 따로 선언해 주어야 합니다.
⚙️Initializer Delegation
Initializer Delegation의 경우에는 init의 중복을 최소화하고 모든속성을 효율적으로 초기화하기 위해서 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
struct Size {
var width: Double
var height: Double
init(w: Double, h: Double) {
width = w
height = h
}
init(value: Double) {
// width = value
// height = value
self.init(w: value, h: value)
}
}
|
cs |
위의 init과 아래의 init의 경우에는 변수명의 중복을 가져올 수 있어 self로 위의 init를 호출하여 사용하는 것을 Initializer Delegation 이라고 합니다.
🔔class의 initializer delegationclass
class의 initializer delegation의 경우에는 3가지 규칙이 있다.
1. subClass의 designated initializer의 경우에는 반드시 superClass의 designated initializer을 호출해야 한다.(Delegate Up)
2. convenience initializer의 경우에는 반드시 같은 class의 initializer를 호출해야한다.(Delegate Across )
3. convenience initializer을 호출할 때 최종적으로 같은 class의 designated initializer을 호출해야한다.
1
2
3
4
5
6
7
8
9
10
|
class Figure{
let name: String
init(name: String){
self.name = name
}
convenience init(){
self.init(name: "unknown")//Delegate Across
}
}
|
cs |
superClass를 선언한 부분이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Rectangle: Figure{
var width = 0.0
var height = 0.0
init(n: String, w: Double, h:Double){
width = w
height = h
super.init(name: n)
}//designated initializer로서 마지막에 상속받은 designated initializer을 호출(Delegate Up)
convenience init(value: Double){
self.init(n: "rect", w: value, h: value)
}
}
|
cs |
Figure를 상속받은 Rectangle를 선언한 부분 입니다.
1
2
3
4
5
6
7
8
9
|
class Square: Rectangle{
convenience init(value: Double) {
self.init(n: "square", w: value, h: value)
}
convenience init(){
self.init(value: 0.0)
}
}
|
cs |
속성초기화의 경우에는 sub -> super로 올라가면서 초기화 되며
중간에 초기화 하지 못하는 속성이 있다면 중간에 초기화 실패로 더이상 진행되지 않는다.
'Ios > Swift' 카테고리의 다른 글
[Swift] Extension 스위프트 형식의 확장 (0) | 2022.08.02 |
---|---|
[Swift] Initializer_3 스위프트 생성자 3 (0) | 2022.08.01 |
[Swift] Initializers 스위프트 생성자 (0) | 2022.07.25 |
[Swift] Overloading 스위프트 오버로딩 (0) | 2022.07.18 |
[Swift] Inheritance 스위프트 상속 (0) | 2022.07.16 |