Swift 클래스에서는 필수 및 위임 이니셜 라이저간에 약간의 혼란이 있습니다.Swift - Required Initializer와 Delegating Initializer 사이에 약간의 혼동이 있습니다.
아래 예제 코드에서 볼 수 있듯이 NewDog는 2 가지 방법 중 하나로 초기화 될 수 있습니다. 보시다시피, 초기화시 나이 만 입력하면 초기화 할 수 있습니다.이 경우 기본 이름 ("Buddy")이 지정됩니다.
내가 아직 이해하지 못하는 이유는 NewDog 클래스가 이니셜 라이저가 사용되지 않는 경우에도 Initializer에 필요한 키워드가 필요한 이유입니다. var georgie가 정규 이니셜 라이저 (NewDog에서 필요한 것이 아닌)를 사용하고 있습니다. 정상적으로 작동합니다.
그렇다면 실제 요구되는 요점은 무엇입니까? * 이니셜 라이저를 없애면 컴파일러가 "필요한 '초기화 프로그램'초기화 '가'개 '하위 클래스에서 제공되어야한다고 말하는 소리를 지른다.
글쎄요 ... 다시 넣어 봤는데 NewDog의 첫 번째 이니셜 라이저가 모든 멤버 속성 초기화를 수행하기 때문에 사용하지 않아도됩니다. 여기 논리.
class Dog {
var name : String
required init(_ name: String) {
self.name = name
}
}
class NewDog: Dog {
var age : Int?
init(age: Int, name: String) {
super.init(name)
self.age = age
}
required init(_ name: String) {
super.init(name)
}
}
var georgie = NewDog(age: 6, name: "Georgie")
georgie.age
누군가가 필요한 키워드가 무엇인지 설명 할 수 있습니까? 내 생각에 컴파일러에게 "이봐 ... 진정해."라는 이름의 속성은 내 하위 클래스에서 초기화 될 것입니다. 왜냐하면 여러분이 저에게 요구하라고 외치고 있기 때문입니다 ... 그래서 진정되고 진정으로 처리 할 것입니다. 그것은 내 자신입니다. 나는 명시 적으로 서브 클래스 이니셜 라이저를 만들 것입니다. "
***** 또한 ALSO! 보너스 질문 : NewDog의 초기화 프로그램 중 어느 것이 지정 초기화 프로그램입니까 ??
감사
는
나는 지정된 것과 필요한 것의 차이에만 혼란스러워했습니다. 그래도 고마워. 또한, Dog 클래스에서 필요한 init은 다형성 목적을위한 것입니다. Dog 형을 취해, 새로운 인스턴스를 초기화 해 돌려주는 팩토리를 작성했습니다. Dog 타입을 사용했기 때문에, 컴파일러가 Dog 타입의 서브 클래스를 통과 할 수 있다는 것을 알려주기 위해 필요했습니다. – user7024499
그럼, true 또는 false ... 당신의 말처럼, "모든 서브 클래스도 같은 초기화자를 구현해야한다"는 것을 의미합니다. 그러나 이것은 서브 클래스가 그 초기화자를 사용해야한다는 것을 의미하지는 않습니다. 위의 예에서 분명히 알 수 있듯이 인스턴스는 다른 지정된 초기화 프로그램을 사용하여 만들어졌습니다. – user7024499
사실, '필수'는 존재해야 함을 의미합니다.반드시 사용해야한다는 것은 아닙니다. – rmaddy