Как обработать объект в NSMutableArray

У меня есть такой объект:

@interface object : NSObject
{    
    NSString *_observation;    
    NSInteger _id;    
    NSString *_date;
    NSString *_device;  
    double _latitude;
    double _longitude; 
}

Итак, как вы видите, у него есть некоторые атрибуты. Затем я создаю NSMutableArray, заполненный объектами, подобными приведенному выше, например

array[object, object ,object, ....]

Я хочу спросить, как я могу обработать определенный атрибут определенного объекта в массиве? Например, как я могу обработать атрибут идентификатора первого объекта в массив в obj-c?

Большое тебе спасибо!


person user1507121    schedule 06.07.2012    source источник
comment
Что вы подразумеваете под обработкой атрибута в массиве? Вы хотите вставить атрибут в массив? Или получить атрибут объекта в массиве? Кстати, вам нужно создать некоторые свойства вокруг этих переменных, иначе вы не сможете получить к ним доступ из-за пределов класса object.   -  person Seva Alekseyev    schedule 06.07.2012
comment
получить атрибут объекта массива. конечно, я создал свойства, это всего лишь пример псевдокода   -  person user1507121    schedule 06.07.2012
comment
Очень трудно понять, о чем вы спрашиваете, можете ли вы привести пример того, что вы хотите сделать?   -  person Dan F    schedule 06.07.2012
comment
В самом деле??? мой английский такой плохой? я хочу, например, это: array.firstObject.id как я могу ссылаться на эту вещь?   -  person user1507121    schedule 06.07.2012


Ответы (4)


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

Если вопрос так прост, это ваше решение:

NSInteger *currID = [array objectAtIndex:x].id;

Кроме того, вы можете использовать быстрое перечисление, чтобы просмотреть весь массив, обращаясь к переменным каждого элемента.

NSInteger *currID;
for (NSObject *currentObject in array) {
    currID = currentObject.id;
    //proccess ID
}

Это предполагает, что вы настроили @property для id так в файле .h:

@property (nonatomic) BOOL latitude;
@property (nonatomic) BOOL longitude;
@property (nonatomic, copy) NSString *observation;    
@property (nonatomic) NSInteger id;    
@property (nonatomic, copy) NSString *date;
@property (nonatomic, copy) NSString *device;

И конечно же в .m:

@synthesize latitude;
@synthesize longitude;
@synthesize observation;
@synthesize id;
@synthesize date;
@synthesize device;
person Michael Boselowitz    schedule 06.07.2012
comment
Вы не можете получить доступ к _id с помощью ., если оно не объявлено как свойство. - person Lorenzo B; 06.07.2012
comment
Переменная экземпляра защищена по умолчанию, поэтому вы не можете сделать то, что вы предложили. Пожалуйста, пересмотрите свой ответ. - person Lorenzo B; 06.07.2012
comment
@Flex_Addicted справедливая оценка. - person Michael Boselowitz; 06.07.2012

Чтобы получить доступ к членам объекта в массиве, вам нужно получить указатель на этот объект. то есть:

object *firstObject = [array objectAtIndex:0];
firstObject.id = 0;
object *secondObject = [array objectAtIndex:1;
...
person Dan F    schedule 06.07.2012

Либо

[[array objectAtIndex:0] id]

or

[array objectAtIndex:0].id

Предположим, что свойство вокруг члена данных _id называется id. Это вызов получателя свойств, а не прямой доступ к ivar.

NSArray не эмулирует и не может эмулировать массивы C с их индексной нотацией a[i]. Это не C++, где оператор [] можно переопределить. В приведенных выше строках скобки представляют собой вызовы методов ObjC (AKA «передача сообщений»), а не индексацию массива.

person Seva Alekseyev    schedule 06.07.2012

Документация NSArray — это ваша друг.

В любом случае, для доступа к массиву объектов вы можете использовать метод - (id)objectAtIndex:(NSUInteger)index из NSArray.

Что говорит Сева Алексеев о том, что ваш класс должен быть построен по-другому. Например:

//.h
@interface MyCustomObject : NSObject
{
    // you dont need to declare variables, the compiler will do it for you
}

@property (nonatomic, copy) NSString* objObservation;
@property (nonatomic, assign) NSInteger objId;
@property (nonatomic, copy) NSString* objDate;
@property (nonatomic, copy) NSString* objDevice;
@property (nonatomic, assign) double objLatitude;
@property (nonatomic, assign) double objLongitude;

@end

//.m
@implementation MyCustomObject

@synthesize objId;
@synthesize objDate;
@synthesize objDevice;
@synthesize objLatitude;
@synthesize objLongitude;
@synthesize objObservation;

- (void)dealloc
{
    /* uncomment if you don't use ARC
    [objDate release];
    [objDevice release];
    [objObservation release];

    [super dealloc];
     */
}

@end

Используйте свой класс так (вам нужно #import "MyCustomObject.h")

// populate your object
MyCustomObject* myObj = [[MyCustomObject alloc] init];
myObj.objDate = @"yourDate";
myObj.objDevice = @"yourDevice";
myObj.objId = 1;
myObj.objLatitude = 22.0;
myObj.objLongitude = 23.87;
myObj.objObservation = @"yourObservation";

// insert it into your array (here only for test purposes but you could create an instance variable for store it)
NSArray* myArray = [NSArray arrayWithObjects:myObj, nil];

// if you don't use ARC
[myObj release];

// grab the object from the array
MyCustomObject * currentObj = [myArray objectAtIndex:0];
// see its values, for example
NSLog(@"%@", [currentObj objDevice]);

Теперь я бы добавил несколько замечаний.

  • Когда вы используете класс, назовите их заглавной буквой, например. MyClass, а не myclass, вместо этого переменные начинаются с нижнего регистра, например. myVariable
  • Если ваш массив может быть заполнен в разное время, вам нужен NSMutableArray. NSArray нельзя изменить после создания. NSMutableArray вместо этого является динамическим, вы можете добавлять или удалять объекты к нему
  • Когда вы имеете дело с объектами, вы должны обернуть свои переменные свойствами (в этом случае вам не нужны переменные, так как компилятор предоставит им директиву @synthesize). Это позволит вам не нарушать инкапсуляцию объектов
  • Вы могли бы подумать о том, чтобы предоставить инициализатор вашему объекту, если хотите

Когда вы пишете вопрос, постарайтесь придать ему некоторый контекст и попытаться объяснить, что вы сделали и чего хотите достичь.

person Lorenzo B    schedule 06.07.2012
comment
Не хотели бы вы использовать strong или retain вместо copy в этом случае. Это просто дополнительные накладные расходы, поскольку они все равно не изменяемы. - person Michael Boselowitz; 06.07.2012
comment
@MichaelBoselowitz stackoverflow.com/questions/9700755/ - person Lorenzo B; 06.07.2012