我收到这个警告。我想做的是有一个类族和一个并行的协议族。Piece 类有这样的声明:
@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 类的每个实例都为 owner 属性返回一个 Player 实例,它符合 PlayerModel 协议。我明白为什么会有这样的警告。尝试将任何符合 PlayerModel 的对象分配给所有者并不是那么安全,因为它可能不属于 Player 类,但在这种情况下这不是问题,因为该属性被声明为协议的只读。
请注意,我还将该属性声明为保留,如果我没记错的话,这对于只读属性是没有意义的,但是如果我不这样做,我也会收到关于协议和类之间不匹配的不同警告。至少编译器不会抱怨一个属性是只读的而另一个不是。
我知道我可以将类属性声明为返回id <PlayerModel>
,但出于几个原因,这是不可取的。将 Piece 对象静态类型为 Pieces 的用户必须进行强制转换才能获得静态类型为 Player 的东西。另外,我必须自己编写属性实现,而不仅仅是使用@synthesize,或者在这种情况下实际上是@dynamic;Core Data 生成属性实现。
那么,我可以指示编译器禁止此警告吗?还是有更好的方法来编写不会生成警告的代码?