2012-12-18 2 views
1

에서 상속되었습니다. BaseRequest 클래스를 만들었으며 BaseParams 프로토콜을 준수하는 속성을가집니다. 다음으로 BaseRequest에서 상속받은 DiagramReqesut 클래스를 만들고 DiagramParam이 BaseParams 프로토콜을 준수하는 유형의 속성을가집니다.속성 유형 ''이 (가) 유형과 호환되지 않습니다 '' '

나는 그것을 컴파일 안전하다고 생각하지만, 엑스 코드는 여전히 경고 : 'DiagramParams는 *'유형 'ID'와 호환되지 않는 'BaseRequest'에서 상속 대지 종류

내가 왜 궁금해.

간체 데모는 여기에 있습니다 :

BaseRequest.h

@interface BaseRequest 

@property (nonatomic,retain) id<BaseParams> params; 

@end 


@protocol BaseParams <NSObject> 

- (NSMutableDictionary *)getParamsDict; 

@end 

에게 DiagramRequest.h

@interface DiagramRequest : BaseRequest 

//warning: Property type 'DiagramParams *' is incompatible with type 'id<BaseParams>' inherited from 'BaseRequest' 
@property (nonatomic,retain) DiagramParams *params; 

@end 


@interface DiagramParams : NSObject <BaseParams> 

@property (nonatomic) int id; 
@property (nonatomic,retain) NSString *city; 

- (NSMutableDictionary *)getParamsDict; 

@end 

답변

2

첫 번째 인터페이스 정의 앞에 두 번째 인터페이스 정의를두면 경고가 제거 될 수 있습니다.

좀 더 간단한 설정을위한 경고를 제거하는 https://stackoverflow.com/a/14632135/1347502 내 대답을 참조하십시오.

+0

작동합니다. – Feather

0

내가 UITextRange 모두의 서브 클래스는 클래스 DTTextRange과 같은 문제가 UITextInput 메서드는 추상 클래스 인 UITextRange를 필요로합니다.

유형으로 DTTextRange를 지정하는 selectedTextRange 속성이있는 경우 DTTextRange가 UITextRange와 호환되지 않는다는 것과 동일한 경고를받습니다.

버그를 끄는 유일한 방법은 내 속성에도 수퍼 클래스를 사용하는 것이 었습니다.

간단히 말해서 나는 당신과 동일한 것을 할 수 있기를 바랍니다. 속성 유형을 변경하는 방법을 찾으면 알려주십시오.

그렇지 않은 경우 하위 클래스 속성을 제거하고 대신이 ID를 사용해야합니다.