1. required init

필수 생성자로, 슈퍼 클래스에서 정의해둘 경우

서브 클래스가 슈퍼 클래스의 생성자를 상속받지 않는 한 서브클래스에서 반드시 구현해주어야 합니다

required init은 서브 클래스에서 "지정 생성자를 직접 구현"했을 경우에 필수적이구나! override 키워드 없이 구현!

class SoptMember {
    var name: String
    var part: String
    
    func sayHello() {
        print("안녕 \\(part)파트 \\(name)아? 솝트는 처음이지?")
    }
    // 모든 프로퍼티를 초기화 하는 생성자
    required init(name: String, part: String) {
        self.name = name
        self.part = part
    }
}

class PartLeader: SoptMember {
    var alias: String
    
		
    init(alias: String) {
        self.alias = alias
        super.init(name: "희재", part: "아요")
    }
    
    required init(name: String, part: String) {
        fatalError("init(name:part:) has not been implemented")
    }
}

어디서 봤더라..?

우리는 UIView / UIViewController를 상속받아 커스텀 클래스를 만들 때, 아래와 같은 코드를 많이 접했다..

왜 이런 코드를 필수로 써줘야 되는걸까?

그 이유는 바로 UIView / UIViewController가 NSCoding 프로토콜을 채택하기 때문이다!

Untitled

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

init(coder: NSCoder)

우리가 코드로 화면을 구성할 수도 있지만, storyboard나 xib를 이용해서 View를 구성할 때도 있다. (난 없다) 그때 그 storyboard나 xib는 우리가 만들어둔 UI의 형태를 xml 형태로 저장하고 있는데, 이 저장된 형태를 우리의 화면으로 가져오기 위해서는 이 xml형태로 저장된 파일의 구성을 가져와야 하는데,

**이 구성을 가져올 때 사용되는 것이 바로 init(coder: NSCoder)**란 것임!!!

but. xib / storyboard 말고 코드로 직접 뷰를 생성하고 싶은데요?!새로 지정 생성자를 직접 구현한다는 것 자체가 부모의 생성자를 상속받지 않는단 것이기 때문

이땐 required init(coder: NSCoder)을 직접 구현해주어야 하는 것임

또 but. fatal error인 이유는,