Цель C: Более чистый способ проверить, не является ли строка пустой перед созданием и назначением строки для словарного ключа? - PullRequest
0 голосов
/ 13 декабря 2018

Я создаю NSMutableDictionary и назначаю NSString (test и test1) ключу параметра.

  NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

  if (test.length) {
      dictionary[@"test"] = test;
  }

  if (test1.length) {
      dictionary[@"test1"] = test1;
  }

Этот метод работает.Тем не менее, я собираюсь в конечном итоге иметь больше строк и не хочу кучу операторов if.Я не хочу, чтобы ключи словаря существовали, если строка пуста или равна нулю.

Не уверен, есть ли способ обойти это.

Я думал о создании отдельной функции, которая принимает массив строк ключей и массив строковых значений и использует цикл for, чтобы увидеть, является ли строказначение пустоЗатем верните словарь после завершения цикла for.Однако вы не можете вставить nil в NSArray

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Синтаксис:

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;

Хотя это немного волшебно и, вероятно, не рекомендуется.

0 голосов
/ 13 декабря 2018

Я бы создал категорию NSMutableDictionary, что-то вроде этого:

NSMutableDictionary+CustomMethods.m:

- (void)setStringIfNotNil:(NSString *)string forKey:(id <NSCopying>)key {
    if (!string || !string.length) { return; }
    self[key] = string;
}

Тогда вы можете использовать ее так:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setStringIfNotNil:test forKey:@"test"]
[dictionary setStringIfNotNil:test1 forKey:@"test1"]
0 голосов
/ 14 декабря 2018

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

Второйсоздание отдельного метода для выполнения этой задачи (проверка строки nil или нет и добавление в словарь).

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

0 голосов
/ 13 декабря 2018

Примерно так:

- (void)updateDic:(NSMutableDictionary *)dic withString:(NSString *)str {
    if (!str || [str isEqualToString:@""]) {
        return;
    }

    dic[str] = str;
}

А затем просто переберите все строки и используйте этот метод.

...