Использование (идентификатора) в Objective C

Я склонен переходить в http://msdn.microsoft.com/ сначала.

7
задан Peter Mortensen 18 August 2016 в 18:02
поделиться

5 ответов

var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

Если вы переходите с объектно-ориентированного языка, вам следует прочитать эту статью .

Я предпочитаю строгую типизацию в моем коде, потому что это облегчает понимание цели. Это также позволяет IDE поддерживать ваши усилия по кодированию с помощью функций intellisense, статического анализа и рефакторинга. Итак, в вашем случае я бы использовал подход №3 или №4 - в зависимости от того, действительно ли наследование подходит для проблемы.

12
ответ дан 6 December 2019 в 08:45
поделиться

Проблема в том, что вы пытаетесь получить доступ к '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];

}
1
ответ дан 6 December 2019 в 08:45
поделиться

Насколько я понимаю, id не имеет никаких методов или переменных, связанных с ним, потому что это общий указатель, который не относится к какому-либо конкретному учебный класс. На этой странице есть полезная информация об идентификаторах, если вы немного прокрутите вниз.

anObject у этого не будет переменной count , поэтому ваша первая попытка не сработает. Создание базового класса и использование его в качестве параметра метода кажется мне лучшей идеей.

поэтому ваша первая попытка не сработает. Создание базового класса и использование его в качестве параметра метода кажется мне лучшей идеей.

поэтому ваша первая попытка не сработает. Создание базового класса и использование его в качестве параметра метода кажется мне лучшей идеей.

0
ответ дан 6 December 2019 в 08:45
поделиться

Вы отправляете сообщение для подсчета, что такое подсчет? id - указатель на любой тип объекта. Если вы ожидаете, что объект будет иметь свойство count, тогда вы сможете передать только Array (или какое-либо другое ограничение типа).

-(NSDecimalNumber*)addCount:(NSArray*) Object{

return [count decimalNumberByAdding: [Object count]]; 

}
0
ответ дан 6 December 2019 в 08:45
поделиться

Вам следует попытаться не обращаться к переменным экземпляра из другого класса.

В 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 , поэтому компилятор его примет.

8
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: