Создайте список свойств словаря программно

Я сказал бы Subclipse, поскольку я не мог даже получить Подрывную работу;)

10
задан rene 4 July 2017 в 20:51
поделиться

4 ответа

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

  • Метод + dictionaryWithObject: forKey: используется для создания NSDictionary с одной парой ключ-значение. Он не будет принимать аргументы, разделенные запятыми, после каждого двоеточия (:) в вызове метода, только один. Чтобы создать словарь с несколькими парами ключ-значение, используйте один из двух связанных методов: + dictionaryWithObjects: forKeys: , который принимает два объекта NSArray, содержащих значения и ключи, или + dictionaryWithObjectsAndKeys: , который альтернативы (объект, ключ, объект, key) с завершающим аргументом nil .
  • Упростите код создания. Вам не нужен миллион локальных переменных только для того, чтобы создать вещь. Используйте встроенные аргументы там, где это имеет смысл. Один из способов сделать это - создать свой словарь в виде кода NSMutableDictionary , а затем (при необходимости) сделать его неизменяемую копию, вызвав для него -copy . (Помните, что метод копирования возвращает новый объект, который вы должны освободить, чтобы избежать утечки памяти.) Таким образом, вам не нужно иметь переменную для каждого отдельного значения, поэтому вы можете выполнить «одноразовое» создание структуры (s ) на каждом уровне.
  • Используйте + arrayWithObject: для создания массива NSArray с одним объектом.
  • (Рекомендации по стилю) Никогда не используйте заглавную букву в начале имени переменной, метода или функция. (Обратите внимание, что SO выделяет переменные с заглавными буквами, такие как имена классов.) Это, безусловно, поможет другим, кто читает ваш код, не запутаться в ваших намерениях вашей схемой именования.

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

NSDictionary *item1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Screen J",[NSNumber numberWithInt:3],nil]
                                                  forKeys:[NSArray arrayWithObjects:@"Title",@"View",nil]];
NSDictionary *item2 = [NSDictionary dictionaryWithObjectsAndKeys:
                                        @"Screen I", @"Title", 
                                        [NSArray arrayWithObject:item1], @"Children", 
                                        nil];
...
24
ответ дан 3 December 2019 в 16:10
поделиться

Я не уверен, что понимаю основную цель здесь.

Похоже, что во время выполнения вы создаете глубокий словарь со многими дочерние узлы. Но вы создаете все это с помощью статического кода ... почему вы не можете просто создать plist (например, тот, который у вас есть) и прочитать его в NSDictionary? И NSDictionary, и NSArray имеют методы, которые позволяют вам просто читать файл и получать весь заполненный объект. Тогда его намного легче редактировать и понимать. Этот метод - dictionaryWithContentsOfFile .

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

Наконец, мне лично не нравится метод dictionaryWithObjects: forKeys: в NSDictionary для создания словаря. Если вам приходится поступать таким образом, я предпочитаю альтернативный метод dictionaryWithObjectsAndKeys: , который делает то же самое, но сохраняет ключи с объектами:

NSDictionary *item1 = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"Screen J",
                       @"Title",
                       [NSNumber numberWithInt:3],
                       @"View"];
2
ответ дан 3 December 2019 в 16:10
поделиться
NSMutableDictionary *topLevel = [NSMutableDictionary dictionary];

NSMutableDictionary *item1 = [NSMutableDictionary dictionary];
NSString *item1title = [NSString stringWithString:@"Title 1"];
NSMutableDictionary *item1children = [NSMutableDictionary dictionary];

//  create children
NSString *item1child1 = [NSString stringWithString:@"item 1, child 1"];

NSMutableDictionary *item1child2 = [NSMutableDictionary dictionary];
NSString *item1child2title = [NSString stringWithString:@"Title 1-2"];
NSMutableDictionary *item1child2children = [NSMutableDictionary dictionary];

NSString *item1child2child1 = [NSString stringWithString:@"item 1, child 2, child 1"];
NSString *item1child2child2 = [NSString stringWithString:@"item 1, child 2, child 2"];

[item1child2 setObject:item1child2title forKey:@"Title"];
[item1child2children setObject:item1child2child1 forKey:@"item 1 child2 child 1"];
[item1child2children setObject:item1child2child2 forKey:@"item 1 child2 child 2"];

[item1child2 setObject:item1child2children forKey:@"children"];

//  add children to dictionary
[item1children setObject:item1child1 forKey:@"item1 child1"];
[item1children setObject:item1child2 forKey:@"item1 child2"];

//  add to item 1 dict
[item1 setObject:item1title forKey:@"Title"];
[item1 setObject:item1children forKey:@"children"];

NSMutableDictionary *item2 = [NSMutableDictionary dictionary];
NSString *item2title        = [NSString stringWithString:@"Title"];
NSMutableDictionary *item2children  = [NSMutableDictionary dictionary]; 

NSString *item2child1 = [NSString stringWithString:@"item 2, child 1"];
NSString *item2child2 = [NSString stringWithString:@"item 2, child 2"];
NSString *item2child3 = [NSString stringWithString:@"item 2, child 3"];

//  add children to dictionary
[item2children setObject:item2child1 forKey:@"item2 child1"];
[item2children setObject:item2child2 forKey:@"item2 child2"];
[item2children setObject:item2child3 forKey:@"item2 child3"];

//  add to item 2 dict
[item2 setObject:item2title forKey:@"Title"];
[item2 setObject:item2children forKey:@"children"];

[topLevel setObject:item1 forKey:@"Item 1"];
[topLevel setObject:item2 forKey:@"Item 2"];
0
ответ дан 3 December 2019 в 16:10
поделиться

сначала .. супер! спасибо .. Я очень ценю объяснение и фрагмент кода. Поскольку вы дали мне такое хорошее объяснение, надеюсь, вы не против, чтобы я задам еще пару вопросов.

Во-первых, я сделал, как вы предложили, и вот что я придумал: (На этот раз я использовал свой исходный список свойств вместо примера, так что именно здесь таблица детализации получает его (или должна получить его) древовидную структуру).

http://img509.imageshack.us/img509/7523/picture2lsg .png

NSDictionary *root = [NSMutableDictionary dictionary];
NSDictionary *item1 = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:@"VirtuaGym Online"] forKey:[NSArray arrayWithObjects:@"Title"]];
NSDictionary *item2 = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:@"Do the training"] forKey:[NSArray arrayWithObjects:@"Title"]];
NSDictionary *item3 = ... 

[root setObject:item1 forKey:@"Item 1"];
[root setObject:item2 forKey:@"Item 2"];

Также провел небольшое исследование и попробовал что-то еще с другим вводом ..

NSMutableArray *Rows = [NSMutableArray arrayWithCapacity: 1];

for (int i = 0; i < 4; ++i) {
  NSMutableArray *theChildren = [NSMutableArray arrayWithCapacity: 1];
  [theChildren addObject: [NSString stringWithFormat: @"tester %d", i]];
NSString *aTitle = [NSString stringWithFormat: @"Item %d", i];
  NSDictionary *anItem = [NSDictionary dictionaryWithObjectsAndKeys: aTitle, @"Title", theChildren, @"Children"];
  [Rows addObject: anItem];
}

NSDictionary *Root = [NSDictionary withObject: Rows andKey: @"Rows"];

Я решил просто протестировать оба из них, но он делает то, что я хочу. Это дает мне ошибку EXC_BAD_ACCESS .

Мне также было интересно, так как я видел, как вы использовали номер в своем фрагменте кода, не могли бы вы также использовать NSString, поскольку это то, что использует plist ... может быть полностью из здесь, конечно

NSDictionary *item1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Screen J",[NSNumber numberWithInt:3],nil]
                                                  forKeys:[NSArray arrayWithObjects:@"Title",@"View",nil]];

, и в-третьих, вопрос о моем возможном подходе к моему приложению. У меня есть парсер xml, который сохраняет определенную информацию в разных массивах. Я хочу использовать эту информацию для моих развернутых UITableviews (infoFirstScreen [] infoSecondScreen [] infoThirdScreen []). Предоставленная информация должна быть связана, как дерево, которое я показал вам выше. По этой причине я хотел создать словарь в коде, чтобы я мог взять информацию из своих массивов и вставить ее сюда. Мой вопрос: как вы думаете, мой подход правильный, неправильный или есть более быстрый способ?

снова очень ценю объяснение;)

0
ответ дан 3 December 2019 в 16:10
поделиться