2014-09-02 2 views
11

저는 Swift에서 iOS 앱을 만들고 Apple에서 제공하는 Lister 샘플 프로젝트를 사용하고 있습니다.Swift에서 NSObject 하위 클래스의 initializer에서 super.init() 호출

리스터는 두 개의 모델 개체 인 List 및 ListItem을 사용합니다. 둘 다 NSObject를 서브 클래스로 만들었지 만 둘 다 초기화 자에서 super.init()을 호출하지 않는다는 것을 알았습니다.

그러나 Lister의 Objective-C 버전에서 두 모델 객체 (AAPLList 및 AAPLListItem)는 [super init]을 호출합니다.

스위프트 프로그래밍 언어 명확하게 "지정된 이니셜 라이저가 자신의 바로 위 수퍼 클래스에서 지정된 초기화를 호출해야한다."고 주장한다 (초기화의 이니셜 체인의 규칙 1)

여기 무슨 일이야? 이 예외가있는 이유는 무엇입니까 항상 하위 클래스에서 super.init()를 호출하면 어떤 규칙이 적용됩니까?

답변

12

문서에서 설명되어있는 위치를 찾을 수는 없지만 기본 수퍼 클래스 이니셜 라이저가 수퍼 클래스의 유일한 이니셜 라이저 인 경우 기본 수퍼 클래스 이니셜 라이저가 서브 클래스 이니셜 라이저의 끝에 호출된다는 점이 무엇입니까 명시 적으로 호출되지 않았습니다.

NSObject 당신이 (자신을 참조하는 예. println(self))super.init():를 호출하지 않습니다 생성자에 시도하여 슈퍼 클래스 initialiser이 서브 클래스 initialiser의 끝에서 호출되는 것을 볼 수 있습니다 (init()); initialiser 기본은 당신 할 수 없습니다 만있다 이 클래스가 완전히 그 시점에서 초기화되지 않기 때문에.

생성자 어딘가에서 자기를 사용하려면 개체가 완전히 그 시점에서 구성 할 필요가 있으므로 그 전에 수동으로 super.init()를 호출해야합니다.

관련 문제