2016-11-23 1 views
0

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의 초기화 프로그램 중 어느 것이 지정 초기화 프로그램입니까 ??

감사

답변

1

required 초기화는 모든 서브 클래스가 같은 초기화를 구현해야한다는 것을 의미합니다. Dog 클래스에서 init(_:) 초기화 프로그램을 만들었으므로 Dog의 모든 서브 클래스 (및 하위 클래스)도 동일한 required init(_:) 초기화 프로그램을 제공해야합니다.

보기에 보면 init(_:) 이니셜 라이저를 Dog 클래스로 만들 필요가 없습니다. 해당 키워드를 제거한 다음 NewDog 클래스에서 init(_:) 이니셜 라이저를 제거 할 수 있습니다.

보너스 - 귀하의 NewDog 클래스의 init 두 메서드는 둘 다 편의 초기화 프로그램이 아니므로 지정된 이니셜 라이저입니다.

기본, 편리 및 필요한 초기화 프로그램의 차이점과 용도를 알아야합니다. 이 내용은 모두 Intializers 섹션의 The Swift Programming Language 섹션에 명시되어 있습니다.

+0

나는 지정된 것과 필요한 것의 차이에만 혼란스러워했습니다. 그래도 고마워. 또한, Dog 클래스에서 필요한 init은 다형성 목적을위한 것입니다. Dog 형을 취해, 새로운 인스턴스를 초기화 해 돌려주는 팩토리를 작성했습니다. Dog 타입을 사용했기 때문에, 컴파일러가 Dog 타입의 서브 클래스를 통과 할 수 있다는 것을 알려주기 위해 필요했습니다. – user7024499

+0

그럼, true 또는 false ... 당신의 말처럼, "모든 서브 클래스도 같은 초기화자를 구현해야한다"는 것을 의미합니다. 그러나 이것은 서브 클래스가 그 초기화자를 사용해야한다는 것을 의미하지는 않습니다. 위의 예에서 분명히 알 수 있듯이 인스턴스는 다른 지정된 초기화 프로그램을 사용하여 만들어졌습니다. – user7024499

+0

사실, '필수'는 존재해야 함을 의미합니다.반드시 사용해야한다는 것은 아닙니다. – rmaddy

관련 문제