Je reçois cet avertissement. Ce que j'essaie de faire, c'est d'avoir une famille de classes et une famille parallèle de protocoles. La pièce de classe a une déclaration comme celle-ci:Objective-C: Le type "warning: property 'owner" ne correspond pas au type de propriété' PieceModel 'du protocole "
@interface Piece : NSManagedObject <PieceModel>
{
}
...
@property (nonatomic, retain) Player *owner;
...
@end
PieceModel a cette
@protocol PieceModel <NSObject>
...
@property (readonly, nonatomic, retain) id <PlayerModel> owner;
@end
Et bien sûr:
@interface Player : NSManagedObject <PlayerModel> { ...
Il me semble que cela devrait tous être totalement sûr. Les utilisateurs des protocoles voient que quelque chose conforme au protocole PieceModel a un propriétaire qui doit se conformer au protocole PlayerModel. En fait, chaque instance de la classe Piece retourne une instance Player pour la propriété owner, qui est conforme au protocole PlayerModel. Je vois pourquoi il y a un tel avertissement. Il ne serait pas aussi sûr d'essayer d'assigner un objet conforme à PlayerModel au propriétaire, car il pourrait ne pas appartenir à la classe Player, mais ce n'est pas un problème dans ce cas car la propriété est déclarée en lecture seule pour le protocole. Notez que j'ai également déclaré la propriété en tant que conserver, ce qui si je ne me trompe est sans signification pour une propriété readonly, mais j'ai également reçu un avertissement différent sur une incompatibilité entre le protocole et la classe si je ne le faisais pas. Au moins, le compilateur ne se plaint pas qu'une propriété est en lecture seule et l'autre ne l'est pas.
Je sais que je pourrais simplement déclarer la propriété de classe comme renvoyant id <PlayerModel>
, mais ce serait indésirable pour plusieurs raisons. Les utilisateurs d'objets Piece qui les ont statiquement typés comme Pieces devraient faire un cast pour obtenir quelque chose de typé statiquement en tant que joueur. Aussi, je devrais écrire l'implémentation de la propriété moi-même au lieu de simplement utiliser @synthesize, ou dans ce cas en fait @dynamic; Les données de base génèrent les implémentations de propriété. Donc, puis-je demander au compilateur de supprimer cet avertissement? Ou existe-t-il un meilleur moyen d'écrire ce code qui ne génèrera pas l'avertissement?
Nope, puis je reçois: avertissement: class 'Piece' ne pas mettre pleinement en œuvre le protocole 'PieceModel' avertissement: définition de la méthode pour '-owner' not found avertissement: 'Piece' mise en œuvre incomplète de classe '- (id) owner;' est identique à '@property (readonly) id owner;', mais le compilateur ne semble pas assez intelligent pour le comprendre dans le cas d'une classe conforme à un protocole . Même si je déclare PieceModel comme: @protocol PieceModel - (Player *) propriétaire; @end que je ne veux pas faire, je reçois les mêmes avertissements. –
Greg
Hmm, j'ai essayé quelque chose d'autre et il semble que votre solution fonctionne mais pas avec la définition @dynamic de la propriété. – Greg
Correct. Ma suggestion évite spécifiquement de déclarer @property dans le protocole PieceModel. – imaginaryboy