Swift
Required Initializer & Failable Initializer
dion_K
2020. 12. 14. 15:26
728x90
꾸벅:)
모든 서브클래스에서 구현해야 하는 필수 생성자와 초기화 실패를 옵셔널로 처리하는 방법에 대해서 알아보도록 하겠습니다.
1. Required Initializer(필수 생성자)
required init(param) { // 문법
}
class Figure {
var name: String
required init(name: String) { // required를 사용하면 서브클래스에서 반드시 동일한 생성자를 직접 구현해야 합니다.
self.name = name
}
func draw() {
print("draw \(name)")
}
}
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)
}
}
2. Failable initializer
- 실패를 허용합니다.
- 초기화에 실패하더라도 에러가 발생하지 않습니다. 대신 nil을 리턴합니다.
- 생성자의 옵셔널 버전이라고 생각하시면 됩니다.
init?(param) {
initialization
}
init!(param) {
initialization
} // 리턴되는 형식은 논 옵셔널입니다.
struct Position {
let x: Double
let y: Double
init?(x: Double, y: Double) {
guard x >= 0.0, y >= 0.0 else { return nil }
self.x = x
self.y = y
}
init!(value: Double) {
guard value >= 0.0 else { return nil }
self.x = value
self.y = value
// self.init(x: value, y: value) 위와 같은 의미, 이런 식으로 호출해도 됩니다.
}
}
var a = Position(x: 12, y: 34)
a = Position(x: -12, y: 0) // nil
var b = Position(value: 12)
b = Position(value: -12) // nil
var b: Position = Position(value: 12)
b = Position(value: -12) // 에러!
728x90