Я склонен переходить в http://msdn.microsoft.com/ сначала.
var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";
Если вы переходите с объектно-ориентированного языка, вам следует прочитать эту статью .
Я предпочитаю строгую типизацию в моем коде, потому что это облегчает понимание цели. Это также позволяет IDE поддерживать ваши усилия по кодированию с помощью функций intellisense, статического анализа и рефакторинга. Итак, в вашем случае я бы использовал подход №3 или №4 - в зависимости от того, действительно ли наследование подходит для проблемы.Проблема в том, что вы пытаетесь получить доступ к 'addFruit.count'. Синтаксис с точкой предназначен только для свойств, объявленных с помощью @property (или для структур). Если вы измените его на
[addFruit count]
и добавите
-(NSDecimalNumber*)count
{
return [[count retain] autorelease];
}
к каждому классу, то он будет работать. Однако вы заметите, что получите предупреждение о том, что «id» может не отвечать на сообщение «count», и если вы не можете быть абсолютно уверены, что элементы, отправленные в этот метод, реализуют метод «count», это проблематичный подход. .
Я согласен с подходом pgb. Вы должны определить протокол и объявить оба класса для реализации этого протокола. Это устраняет проблему незнания, ответит ли объект на «count» или нет, поскольку теперь у вас есть своего рода «контракт».
Если вы хотите сохранить синтаксис точки с свойством, вы можете объявить это в протоколе:
@protocol FruitProtocol
@property(readonly) NSDecimalNumber * count;
- (NSDecimalNumber *)count
@end
и тогда ваша функция будет выглядеть так:
-(NSDecimalNumber*)addCount:(id<FruitProtocol>)addObject{
return [count decimalNumberByAdding:addObject.count];
}
Насколько я понимаю, id
не имеет никаких методов или переменных, связанных с ним, потому что это общий указатель, который не относится к какому-либо конкретному учебный класс. На этой странице есть полезная информация об идентификаторах, если вы немного прокрутите вниз.
anObject у этого не будет переменной count
, поэтому ваша первая попытка не сработает. Создание базового класса и использование его в качестве параметра метода кажется мне лучшей идеей.
Вы отправляете сообщение для подсчета, что такое подсчет? id - указатель на любой тип объекта. Если вы ожидаете, что объект будет иметь свойство count, тогда вы сможете передать только Array (или какое-либо другое ограничение типа).
-(NSDecimalNumber*)addCount:(NSArray*) Object{
return [count decimalNumberByAdding: [Object count]];
}
Вам следует попытаться не обращаться к переменным экземпляра из другого класса.
В Objective-C достаточно, чтобы два объекта реагировали на один и тот же селектор (скажем, count
) , однако это приведет к предупреждению компилятора.
Есть два способа избавиться от этого предупреждения: либо путем создания подкласса от общего класса Fruit
, либо путем согласования двух классов с протоколом. Я бы пошел с протоколом:
@protocol FruitProtocol
- (NSDecimalNumber *)count;
@end
@interface Orange : NSObject<FruitProtocol>
@end
@interface Apple : NSObject<FruitProtocol>
@end
Тогда ваш метод может выглядеть так:
-(NSDecimalNumber*)addCount:(id<FruitProtocol>)addFruit {
return [count decimalNumberByAdding:[addFruit count]];
}
Здесь вы говорите, что ваш addCount
ожидает любой объект, соответствующий протоколу FruitProtocol
, и, следовательно, может реагировать на селектор count
, поэтому компилятор его примет.