은 다음과 놀이터를 생각해 보자. B 클래스에서 StringInitable을 명시 적으로 구현해야합니다 (B 클래스 정의에서 주석을 제거하여 테스트). 제너릭 함수 "maker"가 올바른 이니셜 라이저를 호출하게하려면 어떻게해야합니까?스위프트 프로토콜 상속 및 일반 기능
8
A
답변
2
간단한 이유에 대해 컴파일러 버그와 같은 냄새가납니다. makerB
은 B
유형의 변수이지만 A
인스턴스가 할당됩니다. 이것은 가능하지 않아야하며 사실 makerB
변수 인 another_stored
속성을 인쇄하고 더 일반적으로 액세스하려고하면 런타임 예외가 발생하고 다른 것을 기대하지 않습니다. B
가 A
의 서브 클래스 인 경우, A
의 인스턴스 (대향 가능한 반면) B
유형의 변수에 할당 될 수 없기 때문이다
. B
-A
에서 명시 다운 캐스트가 행해진
- (컴파일러 달리 에러한다) :
A
변수가 참조하는 인스턴스는 실제로B
의 인스턴스입니다 (달리 런타임 예외를 발생시켜야 함)
B
유형의 변수
A
타입의 변수를 할당
는
만 이러한 조건 비록 가능
컴파일러가 올바른 이니셜 라이저를 호출하는 데 실패하지 않았 음을주의하십시오. 다른 클래스의 이니셜 라이저를 호출했습니다.
init 함수 앞에 "필수"지정자를 추가하면 저에게 도움이되었습니다. – user965972