2013-05-08 3 views
2

유효한 구문입니까?프로토콜을 준수하는 클래스 - 컴파일 시간 검사

@protocol SomeProtocol <NSObject> 

@required 
+ (BOOL)isAllowed; 

@end 

내가 필요한 isAllowed 방법을 구현하지 않는 클래스 (예를 들어 UIViewController)를 사용하는 경우 컴파일러는 불평하도록 컴파일시 검사를 시행 할 :로

@property (nonatomic, strong) Class<SomeProtocol> myClass; 

SomeProtocol

정의된다 myClass 속성의 경우

P. SomeProtocol 프로토콜을 준수하지 않는 클래스에서 전달할 때 컴파일러 경고 또는 오류가 발생하지 않습니다.

+1

@ 속성 (비 원자력, 강한) id myClass;'유효하고 자주 사용됩니다. –

+1

질문은 클래스 에 대한 것이고 id 에 대한 설명은 아닙니다. – pshah

답변

4

그것은 구문 적으로 유효하지만 당신이 발견 한 것처럼, 그것은 단지 부적합 클래스에 전달되는 경우를 경고하지, 개체를 보내는 어떤 메시지를 확인합니다. 그 이유는 모든 클래스의 정적 유형은 단지 Class 때문이다, 동적 유형입니다 † - 객체 유형의 변수에 id을 할당 할 수있는 것처럼 Class을 임의의 Class 변수에 할당 할 수 있습니다.

† 참고 : 명확한 것은 "동적 유형"이라는 용어의 기술적 사용이 아닙니다. idClass에 대한 일반적인 구문이 있는지 나는 모른다. 필자는 문맥에서 명확해야한다는 것을 알았지 만, 컴파일러에게 객체에 대한 정적 유형을 선언하고 싶지 않기 때문에 루비 또는 파이썬과 같이 동적으로 타이핑을한다는 사실을 언급하기 위해 사용하고 있습니다.

+0

감사! 컴파일 시간 검사를 시행 할 방법이 있습니까? – pshah

+0

@pshah : 나는 그렇게 믿지 않는다. 핵심 문제는 클래스를 반환하는 모든 메서드 또는 함수가 형식 검사기가 다른 클래스와 호환되는 것으로 간주하는 '클래스'형식을 반환한다는 것입니다. 'id'를 반환하는 메소드들과 같은 거래입니다.'id' 또는'Class'는 "런타임까지 알 수없는 실제 타입"을 의미하기 때문에 정적 타입 제약을 적용 할 수 없습니다. – Chuck

관련 문제