我收到此警告。我想要做的是有一個類的家庭和並行的協議族。類件有這樣的聲明:Objective-C:「警告:屬性'所有者'類型不符合協議'PieceModel'屬性類型」
@interface Piece : NSManagedObject <PieceModel>
{
}
...
@property (nonatomic, retain) Player *owner;
...
@end
PieceModel有這個
@protocol PieceModel <NSObject>
...
@property (readonly, nonatomic, retain) id <PlayerModel> owner;
@end
,當然還有:
@interface Player : NSManagedObject <PlayerModel> { ...
在我看來,這都應該是完全安全的。協議的用戶看到符合PieceModel協議的東西有一個應該符合PlayerModel協議的所有者。事實上,Piece類的每個實例都會返回一個Player屬性的Player實例,該屬性符合PlayerModel協議。我明白爲什麼會有這樣的警告。嘗試將任何符合PlayerModel的對象分配給所有者是不安全的,因爲它可能不屬於Player類,但在這種情況下這不是一個問題,因爲該屬性被聲明爲只讀協議。
注意我還聲明財產爲保留,如果我沒有弄錯對於只讀屬性沒有意義,但是如果我沒有這樣做,我也會得到不同的警告,說明協議和類之間不匹配。至少編譯器不會抱怨一個屬性是隻讀的,另一個不是。
我知道我可以只聲明類屬性返回id <PlayerModel>
,但這會因爲幾個原因而不受歡迎。 Piece對象的用戶將它們靜態類型化爲Pieces將不得不進行強制轉換以獲取靜態類型爲Player的內容。另外,我必須自己編寫屬性實現,而不是僅使用@synthesize,或者在這種情況下實際上是@dynamic;核心數據生成屬性實現。
那麼,我可以指示編譯器抑制此警告嗎?或者是否有更好的方法來編寫不會生成警告的代碼?
沒有,然後我得到: 警告:類「海賊王」不全面貫徹「PieceModel」協議 警告:方法定義「-owner」未找到 警告:不完全的實現類「海賊王」的 ' - (id)owner;'與'@property(只讀)id owner;'相同,但編譯器似乎不夠聰明,無法在符合協議的類的情況下解決這個問題。 即使我聲明PieceModel是這樣的: @protocol PieceModel - (Player *)owner; @end 我不想這樣做,我得到相同的警告。 –
Greg
2010-08-18 06:59:08
嗯,我嘗試了其他的東西,它看起來像你的解決方案工作,但不是與屬性的@dynamic定義。 – Greg 2010-08-18 07:40:17
正確。我的建議明確避免了在PieceModel協議中聲明@property。 – imaginaryboy 2010-08-18 21:45:25