Какой самый простой способ создать массив структур в Cocoa?
Какой самый простой способ создать массив структур?
Ответ 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];
он вызывает ошибку...
проблема решена здесь