2

我创建了一个 BaseRequest 类,它具有符合 BaseParams 协议的属性。接下来我创建了一个从 BaseRequest 继承的 DiagramReqesut 类,它有一个属性,其类型也是 DiagramParam 符合 BaseParams 协议。

我认为编译是安全的,但 xcode 仍然警告:属性类型 'DiagramParams *' 与继承自 'BaseRequest' 的类型 'id' 不兼容

我想知道为什么。

简化的演示在这里:

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
4

2 回答 2

4

DiagramParams可以通过将' 的接口定义放在 's 之前来删除警告DiagramRequest

在此处查看我的答案.. https://stackoverflow.com/a/14632135/1347502删除了警告以进行稍微简单的设置。

于 2013-01-31T18:06:09.397 回答
0

我对作为 UITextRange 子类的类 DTTextRange 有同样的问题,并且所有 UITextInput 方法都需要作为抽象类的 UITextRange。

如果我有一个将 DTTextRange 指定为类型的属性 selectedTextRange,则会收到与您相同的警告,即 DTTextRange 与 UITextRange 不兼容。

我能够消除该错误的唯一方法是在我的财产中也使用超类。

简而言之,我希望能够像您一样做,如果您找到更改属性类型的方法,请告诉我们。

如果不是,则必须删除子类属性并改用 id。

于 2012-12-18T06:06:59.910 回答