2013-08-28 2 views
0

У меня есть метод updateUserPlaceDictionary, который рисует текст из некоторых текстовых полей и бросает его в NSDictionary. Заметив, что все значения словаря были пустыми, я попытался вручную установить некоторые строки для своих ключей, например так:NSDictionary отказывается устанавливать значения для своих ключей.

- (void)updatePlaceDictionary { 
    //Create a dictionary that holds the location data. 
    [self.placeDictionary setValue:[NSString stringWithFormat:@"155 Bovet Rd"] forKey:@"Street"]; 
    [self.placeDictionary setValue:[NSString stringWithFormat:@"san mateo"] forKey:@"City"]; 
    [self.placeDictionary setValue:[NSString stringWithFormat:@"ca"] forKey:@"State"]; 
    [self.placeDictionary setValue:[NSString stringWithFormat:@"94402"] forKey:@"ZIP"]; 

    NSLog(@"%@, %@, %@, %@", [self.placeDictionary objectForKey:@"Street"], 
      [self.placeDictionary objectForKey:@"City"], 
      [self.placeDictionary objectForKey:@"State"], 
      [self.placeDictionary objectForKey:@"ZIP"]); 
} 

Вот моя декларация placeDictionary:

@property NSMutableDictionary* placeDictionary; 

Кроме того, я сделал убедитесь, что он синтезировал его в файле .m.

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

+3

Возможно, вы должны СОЗДАТЬ словарь? –

ответ

9

У вас есть комментарий о том,

// Создать словарь, который содержит данные о местоположении.

, но вы на самом деле его не создаете. Инициализируйте словарь, и все будет в порядке.

self.placeDictionary = [NSMutableDictionary dictionary]; 

Также остерегайтесь: setValue:forKey: не то же самое, как setObject:forKey:. Прочтите this answer, чтобы узнать больше о предмете, но в целом вы должны использовать setObject:forKey: для словарей, например.

[self.placeDictionary setObject:@"155 Bovet Rd" forKey:@"Street"]; 

или современный вариант синтаксиса:

self.placeDictionary[@"Street"] = @"155 Bovet Rd"; 

Использование Objective-C литералы вы можете сделать весь код намного лучше, проверить это:

self.placeDictionary = @{ 
    @"Street": @"155 Bovet Rd", 
    @"City" : @"san mateo", 
    @"State" : @"ca", 
    @"ZIP" : @"94402" 
}; 

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

В качестве последнего замечания, пожалуйста, не используйте

[NSString stringWithFormat:@"aString"] 

поскольку семантически эквивалентно

@"aString" 

но менее оптимизированной с точки зрения характеристик (не говоря уже о качестве кода).

+1

Высокое качество ответа. Не только исправила мою проблему, но и предоставила информацию, которая будет полезна в будущем. Постараюсь запомнить. Спасибо дружище! –

2

Кажется, что вы не выделили его, вы можете сделать это в геттере.

-(NSMutableDictionary *)placeDictionary 
{ 
    if (!_placeDictionary) { 
     _placeDictionary = [NSMutableDictionary dictionary]; 
    } 
    return _placeDictionary; 
} 
+0

Метод инициализации будет лучшим местом. – Chuck

+0

Делая это лениво, вам не нужно беспокоиться, когда и где вы будете называть его первым в своем коде. – Moxy

+4

Поместив его в 'init', вам также не нужно беспокоиться об этом, если вы не запускаете код до' init'. И вы не излишне раздуваете свой код с подробными геттерами. – Chuck