Инициализация NSDictionary - PullRequest
       2

Инициализация NSDictionary

24 голосов
/ 08 февраля 2012

В моем файле .h содержится следующее:

    NSDictionary *originalValues;
    @property (nonatomic, retain) NSDictionary *originalValues;

Это файл .m для инициализации NSDictionary.

@synthesize originalValues;

- (void)viewDidLoad {

// copy original values when view loaded
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine",
                place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating,
                @"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone",
                place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter", 
                place.website, @"website", place.zipcode, @"zipcode", nil];
}

Проблема заключается только в первых четырех объектах иключи добавляются.После этого они не добавляются в словарь, начиная с place.name, @ "name".Я сделал NSLog для всего словаря, и единственное, что было выведено, были первые четыре значения, как я упомянул, так что тогда я сделал NSLog для place.name, и он выводит значение, поэтому я знаю, что что-то должно быть выведено для этого ключа / значенияпара.Есть что-то, чего я здесь не хватает?Мне любопытно, почему все значения изначально не добавляются в NSDictionary?

Ответы [ 3 ]

62 голосов
/ 19 декабря 2013

Если один из объектов nil, вы можете поймать это намного быстрее, если будете использовать новый литеральный синтаксис для инициализации NSDictionary (ниже). Этот синтаксис не только короче, но и более надежен: вы фактически получите ошибку времени выполнения, если один из ваших объектов nil, вместо тихого продолжения выполнения с неполными данными.

originalValues = @{ @"city"     : place.city, 
                    @"latitude" : place.latitude,
                    // etc.
                  };
47 голосов
/ 08 февраля 2012

Причина, по которой они не добавляются, заключается в том, что объект равен нулю, что обозначает конец словаря. Вы должны быть уверены, что каждый объект не является nil, и если это так, вы можете использовать [NSNull null] вместо него. Также используйте self.originalValues = ... для правильного управления памятью. Просто убедитесь, что когда-либо используется словарь проверяет / может обрабатывать NSNull значения.

Пример использования gnu ternary extension:

self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:
                         place.city ?: [NSNull null], @"city",
                         place.cuisine ?: [NSNull null], @"cuisine",
                         place.latitude ?: [NSNull null], @"latitude",
                         place.longitude ?: [NSNull null], @"longitude",
                         place.name ?: [NSNull null], @"name",
                         place.rating ?: [NSNull null], @"rating",
                         place.state ?: [NSNull null], @"state",
                         place.street ?: [NSNull null], @"street",
                         place.telephone ?: [NSNull null], @"telephone",
                         place.timesVisited ?: [NSNull null], @"times visited",
                         place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter", 
                         place.website ?: [NSNull null], @"website",
                         place.zipcode ?: [NSNull null], @"zipcode",
                         nil];
5 голосов
/ 15 сентября 2017

Чтобы избежать случайного ноля в любом словаре, лучшим решением было бы, если бы вы объединили две техники, используя литерал и троичный оператор, например

self.originalValues = @{ @"city" : (place.city ?: @"city"), 
                      @"latitude" : (place.latitude  ?: [NSNull null]),
                      // etc.
                       };

Примечание:

(anyValueOrVariable?: @ "AnyOtherValueOrVariable")

является сокращением и означает то же самое, что и

(anyValueOrVariable! = 0)? anyValueOrVariable: @ "AnyOtherValueOrVariable"

...