- This topic has 3개 답변, 2명 참여, and was last updated 3 years, 10 months 전에 by 야곰.
-
글쓴이글
-
-
mi kim참가자
- 글작성 : 10
- 답글작성 : 8
클래스에서의 이니셜라이져 상속에 대해서 질문입니다.
UIView를 상속받는 클래스 Test를 만들고,
let test = Test()
이 코드를 사용해도 컴파일이 정상적으로 되었습니다.
여기서 Test() 만으로 초기화 할 수 있는 이유를 모르겠습니다.
제가 Test()만으로 초기화 할 수 없다고 생각한 이유는,
- 모든 프로퍼티가 초기화 된 Test 클래스 내에서 초기화 메서드 init() 을 정의하지 않았고,
- 부모클래스 UIView에 정의된 init() 메서드를 상속받을 수 있는게 아닌가 에 대해서는,
클래스 Test에서 이미 다른 지정 초기화 메서드들(init?(coder:), init(v:), init(frame:))를 정의했기 때문에
부모에게서 init()을 상속받을 수 없는게 아닌가 싶었습니다.
혹시몰라서 플레이그라운드에서 제가 생각했을 때 동일한 상황을 만들어 테스트 해보았을 때,
위와 같이 init()을 만들어두지 않은 자식클래스 B에서, init()이 있는 부모클래스 A를 상속받고 있을 때,
let b = B() 는 에러가 났습니다….
init()을 상속받지못한? Test에서 init()을 사용할 수 있는 이유는 뭔가요?ㅠㅠ
2020-12-27 오후 9:44 #34812 -
-
-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
제가 좀 착각을 했습니다. 위에 기본구현때문이라는 것은 틀린 설명인것 같아요.
UIView
는NSObject
를 상속받았고,NSObject
를 상속받은 클래스는 Objective-C 언어의 특성도 공유합니다.
아마도NSObjectProtocol
과NSObject
상속 영향으로 Objective-C 언어의 특성을 사용하는게 아닐까 하는데요, Objective-C에선 이니셜라이저 상속에 특별한 제한조건이 없습니다. 그래서 그냥 상속이 가능합니다.NSObject
에 구현된init
을 스위프트의 이니셜라이저로 인식하지 않는것 같기도 하고요.
저도 더 찾아봐야겠네요.init
을 사용하지 못하게 하려면class A: UIView { private init() { super.init(frame: .zero) } }
해주면 됩니다.
- 이 답변은 야곰에 의해 3 years, 10 months 전에 수정됐습니다.
2020-12-28 오후 12:16 #39563
-
-
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.