2017-01-22 2 views
1

모든 수퍼 클래스에서 상속받는 클래스 세트가 있습니다. 이 슈퍼 클래스는 모든 서브 클래스에 적합 할 정도로 충분히 일반적인 초기화자를 제공합니다. 특히이 포함자동 이니셜 라이저 상속 규칙 둘러보기 Swift

init(values: [String: Any]) { 
    updateValues(dict: values) 
} 

func updateValues(dict: [String: Any]){ 
    //To be implemented in subclasses 
} 

를 서브 클래스에서 updateValues()를 무시함으로써 각각의 서브 클래스가 제대로 자신의 변수를 설정, 모든 것이 작동하는 것 같다 수 있도록 동적 파견을 이용하여.

var name: String? 
var uid: String? 
var email: String? 
var username: String? 

과 같이 그 updateValues() 보인다 :

는 예를 들어, 사용자 클래스, 속성과 같이 선언

override func updateValues(dict: [String: Any]) { 
    self.name = dict["name"] as? String 
    self.uid = dict["uid"] as? String 
    self.email = dict["email"] as? String 
    self.username = dict["username"] as? String 
} 

이 완벽하게 작동합니다. 하지만 변수를 수동으로 설정해야하는 경우에는 사전과 달리 하위 클래스에 사용자 지정 지정된 이니셜 라이저를 추가해야합니다. 예를 들어, 상기 언급 된 사용자 클래스에 대한 하나 개의 예는 초기화 될 것이다 :

init(name: String?, uid: String?, email: String?, username: String?){... 

이 아직 초기화 선언은 바람직하지 않은 결과를 생성한다. 페이지의 Swift "Automatic Initializer Inheritance"규칙에 따라 하나의 지정된 초기화 프로그램이 서브 클래스에 제공되면 더 이상 슈퍼 클래스의 초기화 프로그램을 상속하지 않습니다. 이렇게하면 상속을 지루하게 만듭니다. 자동 상속을 원하는 이니셜 라이저를 재정의해야하며 모든 하위 클래스에 super.init()을 호출하면됩니다. 이 override init - super.init() 해결 방법의 모든 인스턴스에 대한 설명도 다시 써야합니다.

슈퍼 클래스 지정 초기화 프로그램을 계속 상속 받습니까? 아니면 내가 잘못 생각하나요?

참고 : 서브 클래스의 지정된 초기화 프로그램을 주석 처리했으며 수퍼 클래스 초기화 프로그램이 자동으로 상속되었습니다. 추가 서브 클래스 이니셜 라이저를 추가하거나 기능의 주석을 제거하여 기능을 변경하지 않아도되므로 신속한 적용을 위해 안전 체크를 해결하는 방법을 찾고 싶습니다.

답변

1

항상 지정된 초기화 프로그램을 호출해야하며 반드시 초기화해야합니다. 그것이 지정된 초기화 프로그램의 의미입니다. 지정된 이니셜 라이저가 init(value:) 인 경우 init(name: String?, uid: String?, email: String?, username: String?)이이를 호출하는 편리한 초기화 프로그램이어야합니다. 새로운 "must-call"(즉, 지정된 이니셜 라이저)을 구현하면 수퍼 클래스의 지정된 초기화 프로그램이이 서브 클래스에 대해 유효하지 않다는 것을 의미하지만 여기서는 그렇지 않습니다. 따라서 다음과 같이 작성하십시오.

convenience init(name: String?, uid: String?, email: String?, username: String?) { 
    self.init(values: ["name": name, "uid": uid, "email": email, "username": username]) 
} 

다른 문자를 무효로해서는 안됩니다.