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