Какой самый простой способ создать массив структур? - PullRequest
18 голосов
/ 25 декабря 2008

Какой самый простой способ создать массив структур в Какао?

Ответы [ 5 ]

44 голосов
/ 26 декабря 2008

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

Что-то вроде этого для кодирования:

struct foo {
    int bar;
};

struct foo foobar;
foobar.bar = 3;
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)];

А потом вернуть его обратно:

struct foo newFoobar;

if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0)
    [boxedFoobar getValue:&newFoobar];
20 голосов
/ 25 декабря 2008

Или динамическое распределение:

struct foo {
    int bar;
};

int main (int argc, const char * argv[]) {
    struct foo *foobar = malloc(sizeof(struct foo) * 3);
    foobar[0].bar = 7; // or foobar->bar = 7;

    free(foobar);
}
11 голосов
/ 25 декабря 2008

Если вы в порядке с обычным старым массивом C:

struct foo{
    int bar;
};

int main (int argc, const char * argv[]) {
    struct foo foobar[3];
    foobar[0].bar = 7;
}

Если вы хотите NSArray, вам понадобится объект-оболочка. Большинство примитивов используют NSNumber, но это может быть неприменимо к вашей структуре. Оболочка не будет очень трудной для написания, хотя это побеждает цель использования структуры!

Редактировать: Это то, что я не сделал, а просто подумал. Если вы думаете об этом, NSDictionary в основном структура для объектов. Ваши ключи могут быть именами компонентов структуры как NSStrings, а ваши значения могут иметь соответствующий тип данных, помещенный в соответствующую оболочку Какао. Затем просто поместите эти словари в NSArray.

Я думаю, суть в том, что у вас есть много вариантов. На вашем месте я бы поэкспериментировал и посмотрел, что работает лучше.

2 голосов
/ 26 декабря 2008

Это должна быть структура? Обычно лучше сделать это объектом, если вы можете. Тогда вы можете использовать такие вещи, как KVC и Bindings.

0 голосов
/ 11 августа 2011

Класс проще использовать, но что если вам нужно работать с C и целевыми структурами c, такими как CGRect или другими. Я пытался использовать NSValue, но это работает странно ...:

CGRect rect =CGRectMake(20,220,280,30);
NSValue* rectValue = [NSValue valueWithCGRect:rect];
NSArray *params1;
params1= [NSArray arrayWithObjects:rectValue,nil];

Но я могу получить значение CGRect только как:

CGRect cgr = [[params1 objectAtIndex:0] CGRectValue];

Когда я использую это:

id currentVal = [params1 objectAtIndex:0];  
void* buffer;
buffer=[currentVal pointerValue];

это вызывает ошибку ...


проблема решена здесь

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