728x90
Failable Initialization
만약 클래스, 구조체, enum에서 실패할만한 조건이 들어올 때 초기화를 하지 않도록 하려면 어떻게 해야할까?
init? 키워드를 사용해서 init() 메소드를 작성하면 된다.
init?() 메소드를 보면 현재 순위를 입력 받아와 갱신하는 메소드이다. 1보다 작은 순위는 없으므로 순위 값이 0이하일경우 nil을 반환하는 Failable init()을 작성했다. 초기화에 필요한 조건을 만족하지 않는 경우 nil을 리턴하면 된다.
✅ 위와 같이 같은 인자와 같은 이림을 가진 생성자는 공존할 수 없다. (non-failable / failable 둘 다 포함)
다른 생성자와 마찬가지로 슈퍼 클래스의 Failable init()도 하위 클래스에서 오버라이딩이 가능하다.
❗️ non-failable인 슈퍼 클래스의 생성자는 하위 클래스에서 failable로 오버라이딩은 불가능하다.
class eplTeam {
var teamName: String = ""
var teamRank: Int = 0
var teamValues: Int = 0
init() {}
init(teamName: String, teamRank: Int, teamValues: Int) {
self.teamName = teamName
self.teamRank = teamRank
self.teamValues = teamValues
}
init?(currentRank: Int) {
if currentRank <= 0 { return nil }
self.teamRank = currentRank
}
}
class Liverpool: eplTeam {
var captain: String
override init() {
self.captain = "Virgil"
super.init()
}
override init(currentRank: Int) {
self.captain = "Virgil"
super.init()
if currentRank <= 0 {
self.teamRank = 0
} else {
self.teamRank = currentRank
}
}
}
eplTeam의 failable init()을 Liverpool 클래스에서 non-failable init()으로 오버라이딩 했다.
Required Initializer
required 키워드가 init 앞에 붙으면 모든 하위 클래스들이 명시적으로 해당 init()을 구현해야 한다.
- required 키워드가 붙으면 상속의 의미가 이미 있으므로, override 키워드는 붙히지 않는다.
'Swift > Swift 기본기' 카테고리의 다른 글
[Swift] for-in과 forEach를 알아보자. (1) | 2024.01.10 |
---|---|
13. 생성자 (Initialization) - 3 (0) | 2023.08.02 |
12. 생성자 (Initialization) - 2 (0) | 2023.08.01 |
11. 생성자 (Initialization) - 1 (0) | 2023.08.01 |
10. 제네릭 (Generic) (0) | 2023.07.31 |