У меня есть класс AddressCard из примера в «Программирование в Objective C», и я реализую метод isEqual:
Сигнатура этого метода в NSObject использует свободную типизацию для параметра:
- (BOOL)isEqual:(id)anObject
OTOH, пример кода в книге использует строгую типизацию:
- (BOOL) isEqual:(AddressCard *) aCard
Я не уверен, что полностью понимаю, что делает компилятор в этом случае.Я попытался сравнить AddressCard с NSString ([aCard isEqual: @"Foo"]
), ожидая либо ошибки во время выполнения (если система использует мой метод), либо что система вызовет версию IsEqual из NSObject.
Вместо этого был вызван мой метод (хотя этот параметр был NSString, а не AddressCard) и вызвал исключение, когда мой IsEqual: попытался вызвать метод, специфичный для AddressCard:
- (BOOL) isEqual:(AddressCard *) aCard {
if ([name isEqualToString: [aCard name]] && /*here I get the error*/
[email isEqualToString:[aCard email]]) {
return YES;
}else {
return NO;
}
}
Что происходит?Как же NSString передается методу, который ожидает чего-то другого?Можно ли изменить сигнатуру метода при переопределении?