2014-10-06 1 views
8

은 다음과 놀이터를 생각해 보자. B 클래스에서 StringInitable을 명시 적으로 구현해야합니다 (B 클래스 정의에서 주석을 제거하여 테스트). 제너릭 함수 "maker"가 올바른 이니셜 라이저를 호출하게하려면 어떻게해야합니까?스위프트 프로토콜 상속 및 일반 기능

+0

init 함수 앞에 "필수"지정자를 추가하면 저에게 도움이되었습니다. – user965972

답변

2

간단한 이유에 대해 컴파일러 버그와 같은 냄새가납니다. makerBB 유형의 변수이지만 A 인스턴스가 할당됩니다. 이것은 가능하지 않아야하며 사실 makerB 변수 인 another_stored 속성을 인쇄하고 더 일반적으로 액세스하려고하면 런타임 예외가 발생하고 다른 것을 기대하지 않습니다. BA의 서브 클래스 인 경우, A의 인스턴스 (대향 가능한 반면) B 유형의 변수에 할당 될 수 없기 때문이다

. B-A에서 명시 다운 캐스트가 행해진

  • (컴파일러 달리 에러한다)
  • : B 유형의 변수 A 타입의 변수를 할당

    만 이러한 조건 비록 가능

  • A 변수가 참조하는 인스턴스는 실제로 B의 인스턴스입니다 (달리 런타임 예외를 발생시켜야 함)

컴파일러가 올바른 이니셜 라이저를 호출하는 데 실패하지 않았 음을주의하십시오. 다른 클래스의 이니셜 라이저를 호출했습니다.