У меня есть класс под названием AddressCard из примера в «Программирование в Objective C», и я реализую метод isEqual :.Строгий или свободный ввод при переопределении метода
Сигнатура этого метода в NSObject использует свободный ввод параметра:
- (BOOL)isEqual:(id)anObject
Ото, образец кода в книге использует строгую типизацию:
- (BOOL) isEqual:(AddressCard *) aCard
Я не уверен, что я полностью понять, что делает компилятор в этом случае. Я попытался сравнить адресную карту с 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 передается методу, который ожидает что-то еще? Меняет ли подпись метод OK при его переопределении?
Предупреждение отсутствует. Это просто вызывает исключение во время выполнения. – cfischer
Я бы тоже ожидал предупреждения. Кажется немного неаккуратным ... – cfischer
BTW, если я меняю подпись своего метода isEqual:, так что он соответствует NSObject, я получаю предупреждение: «Conflicting types for» - (BOOL) isEqual: (id *) aCard. ? O :-) – cfischer