Проблема в том, что вы пытаетесь получить доступ к addFruit.count. Точечный синтаксис предназначен только для свойств, объявленных с помощью @property (или для структур). Если вы измените его на
[addFruit count]
и добавьте
-(NSDecimalNumber*)count
{
return [[count retain] autorelease];
}
каждому классу, тогда это будет работать. Однако вы заметите, что получите предупреждение о том, что «id» может не отвечать на сообщение «count», и если вы не можете быть абсолютно уверены, что элементы, отправленные этому методу, реализуют метод «count», это проблематичный подход. ,
Я согласен с подходом pgb. Вы должны определить протокол и объявить оба класса для реализации этого протокола. Это устраняет проблему незнания того, будет ли объект реагировать на «подсчет» или нет, поскольку теперь у вас есть своего рода «контракт».
Если вы хотите сохранить синтаксис точки со свойством, вы можете объявить его в протоколе:
@protocol FruitProtocol
@property(readonly) NSDecimalNumber * count;
- (NSDecimalNumber *)count
@end
и тогда ваша функция будет:
-(NSDecimalNumber*)addCount:(id<FruitProtocol>)addObject{
return [count decimalNumberByAdding:addObject.count];
}