2010-06-01 3 views
16

У меня есть NSMutableArray, который я пытаюсь сохранить и получить доступ к некоторым структурам. Как мне это сделать? 'addObject' дает мне ошибку, говорящий «Несовместимый тип для аргумента 1 addObject». Вот пример («в» является NSFileHandle, «массив» является NSMutableArray):Cocoa structs и 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); 
} 

ответ

45

Как уже упоминалось, NSValue может обернуть простой-структуру с помощью +value:withObjCType: или -initWithBytes:objCType::

// add: 
[array addObject:[NSValue value:&p withObjCType:@encode(struct Point)]]; 

// extract: 
struct Point p; 
[[array objectAtIndex:i] getValue:&p]; 

Number and Value guide Смотрите другие примеры.

+0

все голоса говорят все :) – TheTiger

+1

Я не знаю, кто вы, но я найду вас и приведу вам пиво! – CjCoax

3

Вы получаете ошибки, потому что NSMutableArray может принимать только ссылки на объекты, поэтому вы должны обернуть структуры в классе:

@interface PointClass { 
    struct Point p; 
} 

@property (nonatomic, assign) struct Point p; 

Таким образом, вы можете передавать в случаях PointClass.

Редактировать: Как упоминалось выше и ниже, NSValue уже предоставляет это более общим образом, поэтому вам следует пойти на это.

+5

NSValue предоставляет необходимую функциональность. – JeremyP

2

Вы можете использовать NSValue, или в некоторых случаях может иметь смысл использовать словарь вместо структуры.