2015-12-21 2 views
0

Я сделал NSDictionary, скажемNSDictionary после определенного объекта null?

NSDictionary *question = [NSDictionary dictionaryWithObjectsAndKeys: 
            variable_first,@"first", 
            variable_second,@"second", 
            variable_third,@"third", 
            variable_fourth,@"fourth", 
            variable_fifth,@"fifth", 
             nil]; 

Здесь, если любой один из

variable_first variable_second variable_third variable_fourth variable_fifth

Чем, словарь не спасут любой клавиши вперед.

позволяет сказать, что если переменная_third имеет значение null от сервера, то переменная__fourth & variable_fifth не будет добавлена, независимо от того, имеют ли они значения.

Могу ли я увидеть, где яблоко написало это, или любая идея, почему Objective-C демонстрирует такое поведение?

Спасибо.

+1

Учитывая, что список 'nil' завершающим, один не может легко экстраполировать, что' 'dictionaryWithObjectsAndKeys: сохраняет пары данных до тех пор, встречая' nil' – Arc676

+1

variable_first variable_first: [NSNull нуль], @ ​​«первый» использовать этот способ –

+0

при создании словаря 1-го проверяют все 5 значений переменных, если они равны нулю, устанавливают для них пустое и затем назначают словарь. – poojathorat

ответ

1

Вот как NSDictionary работает, прочитайте документацию. Он останавливается первым объектом nil. Это первое значение nil обычно должно быть нулем, которое вы добавляете в конце, но если любое другое значение равно nil, то здесь останавливается словарьWithObjectsAndKeys.

Вы можете использовать современный синтаксис @ {ключ: значение, ключ: значение, ...}

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

Исправление: вы не должны пытаться добавлять нильские объекты в словарь. Есть два способа, и вам нужно решить, какой из них вы хотите: либо вы начинаете с изменяемого словаря, либо добавляете только те пары ключ/значение, где значение не равно нулю. Или вы добавляете значение [NSNull null] вместо nil в словарь. Очевидно, что когда вы обращаетесь к словарю, в одном случае эти значения возвращают нуль, в другом случае они возвращают [NSNull null]. Что вы предпочитаете.

0

Вы можете переопределить геттер всех этих переменных, как этот

-(NSString*) variable_first { 
    if(!_variable_first){ 
    _variable_first = @""; 
    } 
    return _variable_first; 
} 

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

+0

Нет Усама, это нехорошая идея пережить каждый объект. У меня есть общий метод. Я знаю, как с ними справиться. Я лучше знаю, как вставлять ценность. Я хочу знать, почему эта проблема возникает. Дипен дал закрытый ответ. –

1

Не разрешено вставлять nil значение в NSArray, NSMutableArray или любую такую ​​структуру данных. Он будет выставлять значение значения nil исключений. вы можете вместо этого вставить в него объект [NSNull null]. Используйте следующий фрагмент, чтобы проверить nil, если да, тогда вставьте Null объект else его значение.

функция для проверки нулевого значения перед вставкой в ​​структуру данных.

static id isNil(id object) 
{ 
    return object ?: [NSNull null]; 
} 

NSDictionary *question = [NSDictionary dictionaryWithObjectsAndKeys: 
           isNull(variable_first),@"first", 
           isNull(variable_second),@"second", 
           isNull(variable_third),@"third", 
           isNull(variable_fourth),@"fourth", 
           isNull(variable_fifth),@"fifth", 
            nil]; 

Это вставит [NSNull null] объект, где любой стоимости является nil и продолжить выполнение.

+0

NSDictionary не является исключением. Итак, это неправильно; Однако NSArray выдает исключение и сбой. –

+0

isNull - это ужасное имя метода, потому что оно не возвращает, является ли аргумент нулевым, но что-то совершенно другое. – gnasher729

0

ли это так: -

NSDictionary *question = [NSDictionary dictionaryWithObjectsAndKeys: 
           a?a:[NSNull null],@"first", 
           b?b:[NSNull null],@"second", 
           c?c:[NSNull null],@"third", 
           d?d:[NSNull null],@"fourth", 
           ef?ef:[NSNull null],@"fifth", 
           nil]; 
Смежные вопросы