대 "failable 초기화 '초기화하기()가'비 failable 초기화를 재정의 할 수 없습니다." let a = A()
과 같이 사용하면 초기화 프로그램이 예상대로 호출됩니다.스위프트 : 나는</p> <pre><code>public class A: NSObject { public class X { } public init?(x: X? = nil) { } } </code></pre> <p>을 모두 괜찮 선언하면 기본 매개 변수
이제 중첩 클래스 X
을 private로 설정하고 매개 변수화 된 init
도 추가하고 싶습니다 (당연히 있어야합니다). 그러나 단순한 init?()
은 예전처럼 공개적으로 사용할 수 있어야합니다. 그래서
public class B: NSObject {
private class X { }
private init?(x: X?) { }
public convenience override init?() { self.init(x: nil) }
}
쓰기하지만이 init?()
초기화에 오류를 제공합니다 : failable 초기화 '초기화를() 재정의 초기화가 NSObject
에서 public init()
인과 비 failable 초기화을 무시할 수 없습니다.
어떻게 효과적으로 이니셜 라이저 A.init?()
을 충돌없이 선언 할 수 있지만 B.init?()
을 선언 할 수 있습니까?
보너스 질문 : 왜 내가 사용할 수없는 이니셜 라이저를 사용할 수없는 이니셜 라이저를 덮어 쓸 수 없습니까? 그 반대는 합법적입니다. fable 이니셜 라이저를 재정의 할 수 없으며 강제로 super.init()!
을 사용해야하므로 런타임 오류가 발생할 수 있습니다. 나에게 함수의 확장은 실패의 기회를 더 많이 가져 오기 때문에 하위 클래스에 초기화 가능한 이니셜 라이저를 부여하는 것이 더 현명하다고 느낀다. 그러나 어쩌면 여기서 뭔가를 놓치고 있습니다. 설명이 크게 감사하겠습니다.
'override'는 수퍼 클래스에서 같은 서명을 가진 메소드를 의미합니다. 그러나'NSObject'에는'init? '이 없습니다. – vadian
@vadian : 예,하지만'override'를 생략하면 'override override'키워드가 필요하다는 오류 메시지가 생성되므로 무시됩니다. 수정 - 다른 오류를주는'override' 삽입입니다. 또한, fabled가 아닌 init로 대체 할 수 있지만 반대는 허용되지 않습니다. – Stefan