Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Если вы хотите использовать 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];

Ответ 2

Или динамически выделяя:

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);
}

Ответ 3

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

struct foo{
    int bar;
};

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

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

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

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

Ответ 4

Нужно ли быть структурой? Как правило, лучше сделать это объектом, если сможете. Затем вы можете использовать с ним такие вещи, как KVC и Bindings.

Ответ 5

Легче использовать класс, но что делать, если вам нужно работать с 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];

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


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