代码之家  ›  专栏  ›  技术社区  ›  Curt Rand

目标C:在创建字符串并将其分配给字典键之前,检查字符串是否不为空的更清晰的方法?

  •  1
  • Curt Rand  · 技术社区  · 6 年前

    我正在创建一个 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

    4 回复  |  直到 6 年前
        1
  •  2
  •   kirander    6 年前

    像这样的东西

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

    然后迭代所有字符串并使用该方法。

        2
  •  2
  •   Fantini    6 年前

    我要做的是创建一个 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
  •  0
  •   Deepak Kharpodiya    6 年前

    我认为有三种方法…… 第一个使用的类别是,如果条件只有一次,则必须在其中编写,并且可以在项目的任何类中使用它。

    第二种方法是通过单独的方法来完成该任务(检查字符串nil或not,并将其添加到字典中)。

    第三个,只需在数组中添加所有元素,然后在循环中执行该操作。

        4
  •  0
  •   Carl Lindberg    6 年前

    句法:

    dictionary[@"test"] = test
    

    如果test为nil,则将从字典中删除该值(它是普通-setobject:forkey:method和语法调用的-setobject:forkeyedsubscript:之间的差异)。但是,这对空字符串不起作用。

    如另一个答案中所述,您可以使nsdictionary类别方法进行检查,然后改为调用该方法。

    也可以使用常规字典[key]=value语法,完成后,请执行以下操作:

    [dictionary removeObjectsForKeys:[dictionary allKeysForObject:@""]];
    

    如果可以重复这些键,并且不希望空字符串重写早期的有效字符串,则每次都必须检查一次,可以使用category方法,也可以使用本地宏、内联函数或本地方法。

    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)
    

    然后,我的“更新值”(test1);将扩展到:

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

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

    推荐文章