About - (NSDictionary) dictionaryWithObjectsAndKeys: и - PullRequest
21 голосов
/ 22 сентября 2011

У меня очень интересный вопрос.

Внутри одного из моих классов я объявил очень простой метод экземпляра - (NSDictionary) словарь; что реализовано следующим образом:

- (NSDictionary *)dictionary {
    return [NSDictionary dictionaryWithObjectsAndKeys:
                              self.userID, @"id",
                              self.userName, @"name",
                              self.userSurname, @"sName",
                              self.userNickname, @"nName",
                              self.userPassword, @"pwd",
                              [NSNumber numberWithDouble:[self.userBirthday timeIntervalSince1970] * 1000], @"birthday",
                              self.userSex, @"sex",
                              self.userEmail, @"email",
                              self.userLanguage, @"locale",
                              [NSNumber numberWithLongLong:self.userCoin], @"coin",
                              self.userRate, @"rate",
                              [NSNumber numberWithDouble:self.userCoordinate.latitude], @"lat",
                              [NSNumber numberWithDouble:self.userCoordinate.longitude], @"lon",
                              self.userPlaces, @"userPlaces",
                              nil];
    }

с объявленным этим методом, в моем словаре возврата нет ключа @ "userPlaces" (self.userPlace явно оценен и полон объектов).

Итак, я немного изменил свой метод так:

- (NSDictionary *)dictionary {      
    NSMutableDictionary *toReturn = [NSMutableDictionary dictionary];
    [toReturn setValue:self.userID forKey:@"id"];
    [toReturn setValue:self.userName forKey:@"name"];
    [toReturn setValue:self.userSurname forKey:@"sName"];
    [toReturn setValue:self.userNickname forKey:@"nName"];
    [toReturn setValue:self.userPassword forKey:@"pwd"];
    [toReturn setValue:[NSNumber numberWithDouble:[self.userBirthday timeIntervalSince1970] * 1000] forKey:@"birthday"];
    [toReturn setValue:self.userSex forKey:@"sex"];
    [toReturn setValue:self.userEmail forKey:@"email"];
    [toReturn setValue:self.userLanguage forKey:@"locale"];
    [toReturn setValue:[NSNumber numberWithLongLong:self.userCoin] forKey:@"coin"];
    [toReturn setValue:self.userRate forKey:@"rate"];
    [toReturn setValue:[NSNumber numberWithDouble:self.userCoordinate.latitude] forKey:@"lat"];
    [toReturn setValue:[NSNumber numberWithDouble:self.userCoordinate.longitude] forKey:@"lon"];
    [toReturn setValue:self.userPlaces forKey:@"userPlaces"];

    return [NSDictionary dictionaryWithDictionary:toReturn];
}

Все ключи теперь присутствуют в выходном словаре !!!

Эта проблема сводила меня с ума, чтобы понять, но мой вопрос ... Есть какая-то причина, почему второй метод работает лучше, чем первый ??

Я не нашел причины для этого.

Ответы [ 2 ]

38 голосов
/ 22 сентября 2011

[NSDictionary dictionaryWithObjectsAndKeys: прекращает добавлять объекты, когда находит значение nil.

Так что, скорее всего, один из объектов, которые вы пытаетесь добавить в первый код, это ноль.

7 голосов
/ 06 января 2013

Нечто похожее на код ниже решило мою проблему с тем же исключением:

(NSMutableDictionary *)dictionary {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
                          self.userID, @"id",
                          self.userName, @"name",
                          self.userSurname, @"sName",
                          self.userNickname, @"nName",
                          self.userPassword, @"pwd",
                          [NSNumber numberWithDouble:[self.userBirthday timeIntervalSince1970] * 1000], @"birthday",
                          self.userSex, @"sex",
                          self.userEmail, @"email",
                          self.userLanguage, @"locale",
                          [NSNumber numberWithLongLong:self.userCoin], @"coin",
                          self.userRate, @"rate",
                          [NSNumber numberWithDouble:self.userCoordinate.latitude], @"lat",
                          [NSNumber numberWithDouble:self.userCoordinate.longitude], @"lon",
                          self.userPlaces, @"userPlaces",
                          nil];
}
...