une catégorie peut mettre en œuvre simultanément un protocole?
-
11-09-2019 - |
Question
Si une catégorie que je crée pour une classe ajoute des méthodes qui remplissent également le contrat établi par un protocole, je voudrais signaler que la classe de catégorie que la mise en œuvre du protocole, et indiquer ainsi à l'Obj-C avant processeur que la classe implémente le protocole efficacement aussi bien.
délégué Exemple (pour plus de clarté, merci Ole!):
@protocol SomeDelegate <NSObject>
- (void)someDelegateMessage;
@end
Exemple catégorie:
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
Et avec une mise en œuvre autrement typique
@implement NSObject (SomeCategory)
- (void)someDelegateMessage {}
@end
Quand j'essaie en fait, je reçois un avertissement pour chaque méthode NSObject:
avertissement: mise en œuvre incomplète de la catégorie 'SomeCategory'
avertissement: définition de la méthode pour '-description' not found
...
avertissement: définition de la méthode pour '-isEqual:' not found
avertissement: catégorie 'SomeCategory' ne met pas en œuvre pleinement le protocole 'NSObject'
fonctionne très bien si je retire <SomeDelegate>
de la déclaration, mais bien sûr NSObject n'est pas reconnu comme SomeDelegate
La solution
Une solution consiste à déclarer le protocole sur une catégorie sans mise en oeuvre, et mettre en oeuvre le procédé dans une catégorie différente, par exemple:.
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
@implementation NSObject (SomeCategory_Impl)
- (void)someDelegateMessage {}
@end
Si vous faites cela, NSObject
sera considérée comme conforme à <SomeDelegate>
au moment de la compilation, et des contrôles d'exécution pour someDelegateMessage
réussira. Cependant, les contrôles d'exécution conformsToProtocol:
échouera.
Bien sûr, vous devez un bug demandant que les méthodes déclarées sur la classe de base ne génèrent pas avertissements.
Autres conseils
Une chance votre déclaration de protocole inclut le protocole NSObject
? Comme ceci:
@protocol SomeDelegate <NSObject>
...
C'est là que les avertissements viennent parce que maintenant votre catégorie ne met pas en œuvre le protocole complet. Dans le code de test que je viens tapé, la suppression NSObject
du protocole supprime les avertissements du compilateur.
Si vous voulez que le compilateur de se taire sur l'envoi
Vous pouvez également utiliser NSObject comme type variable au lieu.