Синтаксис:
dictionary[@"test"] = test
удалит значение из словаря, если test равен nil (это разница между обычным -setObject: forKey: метод и -setObject: forKeyedSubcript: который вызывается этим синтаксисом).Однако это не сработает для пустых строк.
Как уже упоминалось в другом ответе, вы можете создать метод категории NSDictionary для проверки, а затем вызвать этот метод вместо этого.
Вы также можете просто использоватьобычный словарь [ключ] = значение синтаксиса, затем, когда вы закончите, выполните:
[dictionary removeObjectsForKeys:[dictionary allKeysForObject:@""]];
Если возможно повторение ключей, и вы не хотите, чтобы пустая строка переопределяла ранее действительный допустимый,вам придется проверять каждый раз - либо методом категории, либо с помощью локального макроса или встроенной функции или локального метода.
static inline void SetValidVal(NSMutableDictionary *dictionary, NSString *key, NSString *val) {
if (val.length) { dictionary[key] = val; }
}
или
#define MY_SET_VALID_VAL(dictionary, key, val) if ((val).length) dictionary[key] = (val)
Если имена ключейдолжно совпадать с именем локальной переменной, вы можете играть в другие игры с макросами (это также предполагает имя локальной переменной «словарь»:
#define MY_UPDATE_VAL(val) if (val.length) dictionary[@#val] = (val)
Тогда MY_UPDATE_VAL (test1); будет расширен до:
if (test1.length) dictionary[@"test1"] = test1;
Хотя это немного волшебно и, вероятно, не рекомендуется.