programing

init coder a Decoder란 정확히 무엇입니까?

iphone6s 2023. 4. 12. 21:54
반응형

init coder a Decoder란 정확히 무엇입니까?

온라인 코스에서 iOS 개발을 배우고 있으며 커스텀 뷰(커스텀 테이블 뷰 셀, 컬렉션 뷰 셀 등)를 작성할 때마다 강사가 항상 이 이니셜라이저를 구현합니다.

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

정확히 왜 항상 이걸 불러야 하죠?그게 뭘 하는데?init에 속성을 넣을 수 있습니까?

반대 방향에서 이 답변을 시작하겠습니다. 보기 상태를 디스크에 저장하려면 어떻게 해야 합니까?이것을 시리얼라이제이션이라고 합니다.반대는 디스크에서 개체 상태를 복원하는 역직렬화입니다.

NSCodingprotocol은 오브젝트를 시리얼화 및 역직렬화하는 두 가지 메서드를 정의합니다.

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

그럼 왜 커스텀클래스에 그것이 필요한 거죠?정답은 Interface Builder입니다.개체를 스토리보드에 끌어다 놓으면 Interface Builder가 개체의 상태를 디스크에 직렬화하고 스토리보드가 화면에 나타나면 직렬을 해제합니다.인터페이스 빌더에게 그 방법을 지시해야 합니다.적어도 서브클래스에 새로운 속성을 추가하지 않으면 슈퍼클래스에 패킹 및 언팩 처리를 의뢰할 수 있습니다.따라서,super.init(coder: aDecoder)call. 서브클래스가 더 복잡할 경우 서브클래스에 독자적인 시리얼화 및 시리얼화 해제 코드를 추가해야 합니다.

이는 런타임에 개체를 만들기 위해 숨겨진 파일에 코드를 쓰는 Visual Studio의 접근 방식과는 대조적입니다.

이 이니셜라이저를 실장하기 위한 요건은 다음 두 가지 결과입니다.

  1. 리스코프 대체 원리.S가 T의 서브클래스인 경우(예:MyViewController의 하위 클래스입니다.ViewController, 다음으로 S개의 오브젝트(의 인스턴스)MyViewControllerT 오브젝트(의 인스턴스)를 대체할 수 있어야 합니다.ViewController)가 필요합니다.

  2. 하위 클래스에 명시적으로 정의된 이니셜라이저가 있는 경우 이니셜라이저는 Swift에서 상속되지 않습니다.1개의 이니셜라이저가 명시적으로 지정되어 있는 경우는, 다른 모든 이니셜라이저를 명시적으로 지정할 필요가 있습니다(그 후 콜만 할 수 있습니다).super.init(...)근거에 대해서는, 이 질문을 참조해 주세요.자바어지만 여전히 적용됩니다.

1점만 따지면 모든 것이 원래대로ViewController할 수 있다MyViewController서브클래스는 할 수 있어야 합니다.그러한 것 중 하나는, 소정의 시점으로부터 초기화할 수 있는 것입니다.NSCoder2에 의 「2」가 됩니다.MyViewController서브클래스는 이 기능을 자동으로 상속하지 않습니다.따라서 이 요건을 충족하는 이니셜라이저를 수동으로 제공해야 합니다.이 경우 슈퍼클래스까지 위임하면 보통 하던 일을 할 수 있습니다.

UIView의 커스텀서브클래스를 생성하여 스토리보드 또는 니브파일로 사용하면 Xcode는 스토리보드 또는 니브파일의 내용을 나타내는 XML 파일을 자동으로 생성합니다.앱이 실행되면 XML 파일이 읽히고 인코딩된 개체가 NSCoder 프로토콜을 사용하여 디코딩됩니다.

언급URL : https://stackoverflow.com/questions/38386339/what-exactly-is-init-coder-adecoder

반응형