NSMutableArray только с определенным типом объектов - PullRequest
3 голосов
/ 28 апреля 2010

можно указать, что NSMutableArray может содержать только объекты определенного типа. Например, если я хочу хранить только такие объекты:

@interface MyObject : NSObject {
    UInt8 value; 
}

Для того чтобы можно было использовать переменную экземпляра следующим образом:

- (void)myMethod:(NSMutableArray *)myArray{
    for (id myObject in myArray){
        [self otherMethod:myObject.value];
    }
}

потому что я получаю эту ошибку:

request for member 'value' in something not a structure or union

Спасибо за вашу помощь

Ответы [ 6 ]

15 голосов
/ 28 апреля 2010

Похоже, вы пришли из фона типа Java / C #, где ограничения могут быть наложены на коллекции.

Коллекции в Какао не следуют этому шаблону. Нет никакого способа установить ограничение на то, какие типы объектов могут быть вставлены (если вы не напишите класс-оболочку, который обеспечивает это).

Objective-C, по замыслу, следует философии "если он ходит как утка и крякает как утка, то, скорее всего, это утка". То есть вместо того, чтобы проверять, является ли объект определенным типом, вы должны проверять, может ли он делать то, что вы хотите, независимо от его типа.

Вы можете сделать это, используя respondsToSelector:.

Наконец, ваша проблема на самом деле не связана с тем, что массив не имеет ограничений. Похоже, ваш объект не объявляет переменную экземпляра value как свойство или предоставляет какие-либо методы доступа для него.

Вот почему вы видите ошибку при попытке myObject.value. Этот синтаксис в Objective-C - это способ доступа к свойствам.

Область по умолчанию для переменных экземпляра в Objective-C - @protected, что означает, что что-либо вне вашего класса не может получить к ним доступ, не пройдя какой-либо метод доступа.

Вам необходимо объявить и определить методы - (UInt8)value и - (void)setValue:(UInt8)aValue и использовать их.

Кроме того, вы можете объявить его как свойство.

7 голосов
/ 28 апреля 2010

Вы получаете эту ошибку, потому что для Objective-C myObject относится к типу id, который не поддерживает свойство value. Чтобы осведомить Objective-C о том факте, что он всегда имеет дело с MyObject в этом цикле, вы должны сказать ему, что объект myObject является экземпляром MyObject.

for (MyObject *myObject in myArray) {

Кроме того, вы должны убедиться, что value ivar доступен с помощью точечной нотации, реализовав для него методы getter и setter. Вы можете сделать это самостоятельно, внедрив -value и -setValue:, или вы можете использовать @property и @synthesize, чтобы Objective-C сделал это.

0 голосов
/ 05 января 2014

возможно вы можете использовать протокол:

@protocol Person <NSObject>
@end

@interface Person : NSObject <Person>
@end

использовать:

NSArray<Person>*  personArray;
0 голосов
/ 28 апреля 2010

Подкласс NSMutableArray и методы переопределения, которые обеспечивают добавление объектов в массив. Вы бы проверили тип объекта в этих переопределенных методах, вызывая [super addObject:xyz] только если тип принят.

0 голосов
/ 28 апреля 2010

Вам нужно написать класс-оболочку для NSMutableArray, см., Например, этот вопрос .

0 голосов
/ 28 апреля 2010

Objective-C не работает так. Вам нужно использовать [myObject value] (который будет работать независимо от типа объекта, если он отвечает на -[value]. Если вы хотите, чтобы в нем был только один тип объектов, вставьте только объекты этого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...