2010-10-02 2 views
3

Действительно ли это «лучший стиль», чтобы отправить сообщение и надеяться, что объект ответит, или проверить, реагирует ли он на селектор и что-то вроде резервного, если он этого не делает.Использует откликиToSelector: хороший стиль?

Например:

- (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]]; 
    } 
} 

против

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

(в приведенном примере из подкласса NSNumberFormatter ... но может быть из подкласса NSObjectFormatter ...)

ответ

2

Если вы не на 100% уверены, что все экземпляры, которые приходят к вашей функции (stringForObjectValue), отвечают на селектор, то вы должны должны выполнить, чтобы избежать сбоев во время выполнения.

Как обрабатывать случаи, когда obj не отвечает на intValue. Селектор может зависеть от конкретного контекста, в котором используется ваш метод. Например, вы можете вернуть объект nil из метода в этом случае, чтобы вы могли легко увидеть, что что-то пошло не так.

1

Если вы не знаете точный тип, то использовать respondsToSelector: определенно хороший стиль, потому что вы рискуете исключением иначе. И это так важно, что есть имя для этой техники: Duck Typing.

Смежные вопросы