2009-07-14 3 views
1

Я пытаюсь выяснить, как делать либо вложенные массивы, либо многомерный массив для программирования iPhone SDK с использованием объектива-c.Как создать вложенный массив или многомерный массив

Мои данные были бы что-то вроде этого, 3 столбцов и строк от 10 до 50.

name  department  year 
John  Sales   2008 
Lisa  Sales   2009 
Gina  Support  2007 

Любая помощь приветствуется

+0

Одно замечание: вы не хотите, вложенных друг в друга NSArrays из-за способа использования класса для проверки наличия объекта в коллекции: При использовании containsObject: NSArray посылает -hash сообщение для каждого объекта в коллекции и сравнивает результат с объектом, присутствие которого вы проверяете. Когда объектом является другой сбор, реализация по умолчанию отправляет хэш в коллекцию, которая, в свою очередь, отправляет ее каждому объекту внутри него. Поэтому, если вам нужна быстрая и эффективная матрица, вам нужно бросить свой собственный. –

ответ

1

Не могли бы вы, возможно, сделать структуру, как это:

struct UserInfo 
{ 
string name; 
string department; 
int year; 
} 

struct UserInfo users[3]; 
users[0].name = "John"; 

etc.... 

и сделать массив из структуры, чтобы вам не приходилось иметь дело с многомерными массивами? Если нет, тогда просто игнорируй меня! :)

+0

Согласен, это гораздо более чистое решение, чем использование массивов массивов. – amischiefr

+2

Чтобы сделать это в Objective-C, вам нужно сделать его объектом, а не структурой (поскольку структуры не могут правильно управлять своим содержимым). – Chuck

1

Вложенные массивы - единственный действительно практичный способ сделать многомерный массив в Cocoa. Вы можете определить категорию в NSArray с помощью методов, таких как objectAtRow:column:, чтобы сделать доступ к элементам более удобным. Хотя в вашем случае я согласен с Caleb в том, что это не похоже на то, что вам нужно - ваши данные выглядят как массив объектов.

5

Я не уверен, что это ваш пример или терминология, но это не многомерный массив, это массив записей. Я бы, чтобы каждый из ваших записей класс:

@interface Employee 
    NSString* name; 
    NSString* dept; 
    NSString* year; 
@end 

@property (nonatomic,retain) NSString* name; 
@property (nonatomic,retain) NSString* dept; 
@property (nonatomic,retain) NSString* year; 

// ... rest of class def 


Employee* a = [[Employee alloc] init]; 
a.name = @"Bob"; 
a.dept = @"Sales"; 
a.year = @"2008"; 

// declare others 

NSArray* array = [NSArray arrayWithObjects:a,b,c,nil]; 
[a release]; 

Это более Objective C-иш, чем при использовании struct.

Если вы действительно имеете в виду многомерный массив, тогда нет ничего плохого в «очевидном» подходе. Конечно, возможно, вы захотите обернуть его в классе, чтобы вы могли также написать некоторые полезные методы, чтобы упростить работу.

+0

Да, мой код довольно старая школа! – CalebHC

+0

Спасибо вам за помощь. Я попытался использовать этот подход, но как бы вы вернули значения обратно? Сотрудник * a = [[Employee alloc] init]; a.name = @ "Bob"; a.dept = @ "Продажи"; a.year = @ "2008"; Сотрудник * b = [[Распределение сотрудников] init]; b.name = @ "Gina"; b.dept = @ "Поддержка"; b.year = @ "2007"; NSString * yourData = [массив objectAtIndex: indexPath.row]; Вышеприведенная строка yourData вызывает ошибку. Как получить значения, например, значение Year для второй строки? – 2009-07-14 23:19:07

+0

Что в вашем файле .m? Вы добавили строку @synthesize для каждого свойства? –

0

from @Stephen example ... Вы можете сделать это, чтобы получить имя первого сотрудника.

Employee *e = (Employee *) [array objectAtIndex:0]; 

NSLog(@"Name: %@", e.name); 
Смежные вопросы