2012-12-18 75 views
1

我創建了一個BaseRequest類,它具有一個符合BaseParams協議的屬性。 和接下來我創建了一個從BaseRequest繼承的DiagramReqesut類,它有一個類型爲DiagramParam的屬性也符合BaseParams協議。屬性類型''與繼承自''的類型''不兼容''

我認爲這是編譯安全的,但仍Xcode中警告說: 房產類型「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

我有一類DTTextRange同樣的問題,這是UITextRange和所有的子類UITextInput方法需要UITextRange這是一個抽象類。

如果我有一個屬性selectedTextRange,它指定DTTextRange爲類型,並獲得與DTTextRange與UITextRange不兼容的警告。

我能夠解決這個問題的唯一方法就是在我的財產中使用超類。

總之,我希望能夠做到與你一樣,讓我們​​知道如果你找到一種方式來改變屬性類型。

如果不是,則必須刪除子類屬性並使用該id。