티스토리 뷰

iOS/Simple Knowledge

required init?(coder:)

Giraff 2017. 12. 1. 00:39

UIView와 UIViewController를 상속하여 지정이니셜라이저를 작성할 때, 다음과 같은 에러와 마주하게 된다.



'required' 이니셜라이저인 'init(corder:)'를 정의해주어야 한다는 에러인데, 다음과 같이 정의만 해주면 에러 문구는 사라진다.


required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }


왜 이런 에러가 발생하며 위와 같은 작업을 해주어야 할까?

바로, 이 NSCoding이라는 녀석 때문이다.

public protocol NSCoding {


    

    public func encode(with aCoder: NSCoder)


    public init?(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER

}


NSCoding 프로토콜은 이를 구현하는 클래스로 하여금, 위와 같이 실패가능한 이니셜라이저를 작성하도록 한다.

프로토콜에 명세된 이니셜라이저를 구현하면 required 키워드가 붙으며,
required 키워드가 붙는 이니셜라이저는 상속받은 자식 클래스에서도 반드시 구현해주어야 한다.

UIView와 UIViewController는 NSCoding 프로토콜을 구현하고 있으므로,
따라서 이를 상속받은 클래스에서는 required init?(coder:)를 구현 해주어야 한다.

그렇다면, 이전에는 required init?(coder:)을 구현해야한다는 문구가 나오지 않다가 새로운 지정 이니셜라이저를 작성할 때 나타나는 것일까?

Swift에서는 자식클래스에서 지정이니셜라이저를 따로 작성하지 않은 경우, 부모의 이니셜라이저들을 자동으로 상속한다. 
따라서, required init?(coder:) 또한 상속되어 오류 문구가 나오지 않는다. 

하지만 자식클래스에서 이니셜라이저를 작성하게되면, 부모 클래스의 이니셜라이저들이 자동상속 되지 않아
required init?(coder:)을 구현하라는 오류 문구가 나오게 되는 것이다.


'iOS > Simple Knowledge' 카테고리의 다른 글

More Accessible in iOS  (0) 2018.02.23
UIModalPresentationStyle  (0) 2017.12.27
layoutIfNeeded와 setNeedsLayout  (1) 2017.12.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함