Я получаю это предупреждение. Я пытаюсь создать семейство классов и параллельное семейство протоколов. Класс 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 возвращает экземпляр Player для свойства owner, что соответствует протоколу PlayerModel. Я понимаю, почему есть такое предупреждение. Было бы небезопасно пытаться присвоить любой объект, который соответствует PlayerModel, владельцу, поскольку он может не принадлежать классу Player, но в этом случае это не проблема, поскольку свойство объявляется для протокола только для чтения.
Обратите внимание, что я также объявил свойство как retain, которое, если я не ошибаюсь, не имеет смысла для свойства только для чтения, но я также получил другое предупреждение о несоответствии между протоколом и классом, если я этого не сделал. По крайней мере, компилятор не жалуется, что одно свойство доступно только для чтения, а другое - нет.
Я знаю, что мог бы просто объявить свойство класса как возвращающее id <PlayerModel>
, но это было бы нежелательно по нескольким причинам. Пользователи объектов Piece, у которых они статически типизированы как Pieces, должны будут выполнить приведение, чтобы получить что-то статически типизированное как Player. Кроме того, я должен был бы написать реализацию свойства сам, а не просто использовать @synthesize, или в этом случае фактически @dynamic; Базовые данные генерируют реализации свойств.
Итак, могу ли я дать указание компилятору подавить это предупреждение? Или есть лучший способ написать этот код, который не будет генерировать предупреждение?