2010-10-02 6 views
3

Est-ce un "meilleur style" pour envoyer un message et espérer que l'objet répond, ou pour vérifier s'il répond à un sélecteur et avoir une sorte de repli si ce n'est pas le cas.Utilise respondsToSelector: bon style?

Par exemple:

- (NSString *)stringForObjectValue:(id)obj { 
    if ([obj respondsToSelector:@selector(intValue)]) { 
     NSString *roman = [self formatRomanNumber:[obj intValue] resultSoFar:@""]; 
     return roman; 
    } else { 
     return [NSString stringWithFormat:@"can't format a %@", [obj class]]; 
    } 
} 

contre

- (NSString *)stringForObjectValue:(id)obj { 
    NSString *roman = format_roman(@"", [obj intValue]); 
    return roman; 
} 

(l'exemple est d'une sous-classe NSNumberFormatter ... mais il pourrait être d'une sous-classe NSObjectFormatter ...)

Répondre

2

Si vous n'êtes pas sûr à 100% que toutes les instances de votre fonction (stringForObjectValue) répondent au sélecteur, alors doit effectuer cette vérification pour éviter les plantages en cours d'exécution.

Comment gérer les cas où obj ne répond pas au intValue Le sélecteur peut dépendre du contexte particulier dans lequel votre méthode est utilisée. Par exemple, vous pouvez renvoyer un objet nil de la méthode dans ce cas afin que vous puissiez facilement voir que quelque chose s'est mal passé

1

Si vous ne connaissez pas le type exact, alors utiliser respondsToSelector: est certainement un bon style, car vous risquez une exception sinon. Et c'est tellement important qu'il y a un nom pour cette technique: Duck Typing.