Если NSDictionary хорош для парных значений, что хорошо для тройных значений? - PullRequest
6 голосов
/ 19 июня 2009

NSDictionary хорош для пар ключ-значение. Какая структура данных лучше всего подходит для случаев, когда у вас есть три значения? Лучше всего создать класс для этих 3 значений, а затем позволить каждому объекту в массиве содержать экземпляры этого класса?

Конкретно: структура данных, назовем ее Person, я предполагаю, имеет три значения: (NSString) имя, (int) возраст, (BOOL) isAlive

Они будут храниться в массиве (?). Важно иметь возможность использовать имя в качестве ключа, а также ссылаться на весь блок с номером, начиная с нуля.

Ответы [ 6 ]

9 голосов
/ 19 июня 2009

Если у вас один ключ и два значения, вы, вероятно, создадите класс для этих двух значений и по-прежнему будете использовать словарь.

Если у вас есть два ключа и одно значение, вы, вероятно, будете использовать вложенный словарь, то есть словарь, в котором ключ является первым ключом, а значение - другим словарем. Ключом для вложенного словаря будет второй ключ, а значением будет ваше фактическое значение.

ETA:

Теперь, когда вы прояснили свой вопрос - если вам нужен доступ к вашей коллекции как по ключу, так и по целочисленному индексу, вы все равно можете использовать словарь.

Чтобы получить предмет по ключу, вы должны сделать это:

[myDict objectForKey:@"joe"];

Чтобы получить элемент по индексу, вы можете использовать массив allKeys:

[myDict objectForKey:[[myDict allKeys] objectAtIndex:1]];

Если единственной целью получения людей по индексу является цикл по всей коллекции, лучше было бы изучить использование метода keyEnumerator для перечисления ключей в цикле и использования этих ключей для поиска значений.

1 голос
/ 20 июня 2009

Поначалу это может показаться не связанным, но ознакомьтесь со структурой, ориентированной на словарь, в этом Введение в связывание какао . (CocoaDevCentral и Скотт Стивенсон - отличные ресурсы для новых разработчиков Cocoa.) Подход, который он использует, чрезвычайно гибок и его легко изменить в будущем. Использование словаря вместо ivars - не всегда лучшее решение, но оно может подойти для ваших нужд.

Примечание: Как и базовые данные, привязки какао также очень сложная тема. Я предлагаю использовать только организационный аспект учебника, а не привязываться к нему полностью. : -)

1 голос
/ 19 июня 2009

Вы можете использовать базовые данные для представления более сложных отношений данных, используя модель реляционной базы данных.

Посетите сайт разработчика Apple для примеров и документации.

0 голосов
/ 19 июня 2009

Вам нужно изучить CoreData (если вы его храните) и определить класс для вашего объекта. Собственные универсальные объекты, такие как NSDictionary, не предназначены для хранения сложных значений, которые составляют сложные объекты, такие как Person.

Person *person = [[Person alloc] init];
person.firstName = @"blah";
person.age = 24;
person.isAlive = YES;
0 голосов
/ 19 июня 2009

Это зависит от того, пытаетесь ли вы создать некую обобщенную структуру данных или нет. Если «три» являются конкретными понятиями в вашем приложении, то вы можете направиться к доменной модели - в этом случае вам может быть целесообразно инкапсулировать эти значения в классе.

Если вам требуется словарь, подобный функциональности - [NSDictionary objectForKey:] и т. Д. - тогда вы все равно можете использовать один или несколько словарей в качестве индексов, которые сопоставляют значения ключей с экземплярами вашего класса.

0 голосов
/ 19 июня 2009

Разве это не описание двумерного массива?

...