96 votes

Transforme une instance d'une classe en un @ protocole en Objective-C

J'ai un objet (un UIViewController) qui peut ou non être conforme à un protocole que j'ai défini.

Je sais que je peux déterminer si l'objet est conforme au protocole, puis appeler la méthode en toute sécurité:

 if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}
 

Cependant, XCode affiche un avertissement:

 warning 'UIViewController' may not respond to '-protocolMethod'
 

Quel est le bon moyen d'éviter cet avertissement? Je n'arrive pas à convertir self.myViewController en classe MyProtocol .

167voto

Nick Forge Points 13758

La bonne façon de le faire est de faire:

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}

L' UIViewController <MyProtocol> * type-cast se traduit par "vc est un UIViewController objet conforme à MyProtocol", tandis que l'utilisation de id <MyProtocol> se traduit par "vc est un objet d'un inconnu de la classe qui est conforme à MyProtocol".

De cette façon, vous le compilateur va vous donner le bon type de contrôle sur vc - le compilateur ne fera que vous donner un avertissement si une méthode qui n'est pas déclarée sur UIViewController ou <MyProtocol> est appelé. id doit être utilisé uniquement dans cette situation si vous ne connaissez pas la classe, du type de l'objet moulé.

59voto

Andy Points 15910

Vous pouvez le lancer comme ceci:

 if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}
 

Cela m'a jeté un peu, aussi. En Objective-C, le protocole n'est pas le type lui-même. Vous devez donc spécifier id (ou un autre type, tel que NSObject ) avec le protocole souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X