Objective C:在创建字符串并将其分配给字典键之前检查字符串是否为空的更简洁方法?

Objective C: A cleaner way to check if a string isn't empty before creating and assigning a string to a dictionary key?

我正在创建一个 NSMutableDictionary 并将一个 NSString(test 和 test1)分配给参数键。

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

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

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

这个方法确实有效。但是,我最终将拥有更多字符串,并且不想要一堆 if 语句。如果字符串为空或 nil,我不希望字典键存在。

不确定是否有办法解决这个问题。

我想过创建一个单独的函数来接受键字符串数组和字符串值数组,并使用 for 循环来查看字符串值是否为空。然后,一旦 for 循环结束, return 一个字典。但是,您不能将 nil 插入 NSArray

像这样

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

    dic[str] = str;
}

然后遍历所有字符串并使用该方法。

我要做的是创建一个 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"]

我认为有3种方法.. 第一个使用类别,您只需在其中编写一次 if 条件,您可以在项目的任何 class 中使用它。

第二个方法是创建一个单独的方法来完成该任务(检查字符串是否为 nil 并添加到字典中)。

而第三个,只需将所有内容添加到一个数组中,然后循环执行操作。

语法:

dictionary[@"test"] = test
如果 test 为 nil,

将从字典中删除该值(这是普通 -setObject:forKey: 方法和 -setObject:forKeyedSubcript: 语法调用的区别)。但是,这不适用于空字符串。

正如另一个答案中提到的,您可以创建一个 NSDictionary 类别方法来检查,然后调用该方法。

您也可以只使用常规字典[key] = value 语法,然后在完成后执行:

[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)

如果键名需要和局部变量名相同,可以用宏玩其他游戏(这里也假设局部变量名"dictionary":

#define MY_UPDATE_VAL(val) if (val.length) dictionary[@#val] = (val)

然后MY_UPDATE_VAL(test1);将扩展为:

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

不过这有点神奇,可能不推荐。