Cocoa structs и NSMutableArray
У меня есть NSMutableArray, который я пытаюсь сохранить и получить доступ к некоторым структурам. Как мне это сделать? 'addObject' дает мне ошибку, говорящий "Несовместимый тип для аргумента 1 addObject". Вот пример ('in' - это NSFileHandle, 'array' - это NSMutableArray):
//Write points
for(int i=0; i<5; i++) {
struct Point p;
buff = [in readDataOfLength:1];
[buff getBytes:&(p.x) length:sizeof(p.x)];
[array addObject:p];
}
//Read points
for(int i=0; i<5; i++) {
struct Point p = [array objectAtIndex:i];
NSLog(@"%i", p.x);
}
Ответы
Ответ 1
Как уже упоминалось, NSValue
может обернуть простую структуру, используя +value:withObjCType:
или -initWithBytes:objCType:
:
// add:
[array addObject:[NSValue value:&p withObjCType:@encode(struct Point)]];
// extract:
struct Point p;
[[array objectAtIndex:i] getValue:&p];
Подробнее см. Руководство по количеству и значению.
Ответ 2
Вы получаете ошибки, потому что NSMutableArray
может принимать ссылки только на объекты, поэтому вы должны обернуть ваши структуры в класс:
@interface PointClass {
struct Point p;
}
@property (nonatomic, assign) struct Point p;
Таким образом, вы можете передать экземпляры PointClass
.
Изменить. Как упоминалось выше и ниже, NSValue уже предоставляет это более общий путь, поэтому вы должны пойти с этим.
Ответ 3
Вы можете использовать NSValue, или в некоторых случаях может иметь смысл использовать словарь вместо структуры.