【问题标题】:An Important Question About NSDictionaries关于 NSDictionaries 的一个重要问题
【发布时间】:2010-06-24 13:51:01
【问题描述】:

我有一个带有 NSStrings 的 NSDictionary

一些 valueForKey:@"Key" 没有条目,所以它是 (null)

NSMutableString* addressDictionaryToString = [NSMutableString string];  // use mutable string!
for (NSDictionary* item in address) {     // use fast enumeration!
        [addressDictionaryToString appendFormat:@"%@, %@, %@, %@",
         [item objectForKey:@"Street"],         
         [item objectForKey:@"City"],
         [item objectForKey:@"State"],
         [item objectForKey:@"ZIP"]
         ];
    NSLog(@"MutableString: %@", addressDictionaryToString);
}

所以我想构建一个 NSMutableString 但过滤掉那些为空的键。有什么想法吗?

更新:::::

基本上我希望得到的字符串看起来像

1 Infinite Loop, Cupertino, CA, 95014(如果所有字段都可用)

如果我错过了这条街,那么

加利福尼亚州库比蒂诺,95014

如果我错过了州,那么

1 无限循环,库比蒂诺,95014

如果我只有状态,那么它应该打印

加拿大

(注意最后一个元素没有逗号)

【问题讨论】:

    标签: cocoa cocoa-touch nsarray nsdictionary nsmutablestring


    【解决方案1】:

    如何检查键是否有值?

    NSMutableString * addressDictionaryToString = [NSMutableString string];
    for (NSDictionary * item in address)
    {
        if ([item objectForKey:@"Street"])
            [addressDictionaryToString appendFormat:@"%@, ", 
             [item objectForKey:@"Street"]];
        if ([item objectForKey:@"City"])
            [addressDictionaryToString appendFormat:@"%@, ", 
             [item objectForKey:@"City"]];
        if ([item objectForKey:@"State"])
            [addressDictionaryToString appendFormat:@"%@, ", 
             [item objectForKey:@"State"]];
        if ([item objectForKey:@"ZIP"])
            [addressDictionaryToString appendFormat:@"%@, ", 
             [item objectForKey:@"ZIP"]];
        NSLog(@"MutableString: %@", addressDictionaryToString);
    }
    

    问题是,在您的上一个问题中,您说您的目标是创建一个 CSV 文件。如果您的行有不同数量的字段且没有可靠的方法来识别每个字段,那么它在技术上不是有效的 CSV。

    相反,你可以试试这个:

    NSMutableString * addressDictionaryToString = [NSMutableString string];
    for (NSDictionary * item in address)
    {
        [addressDictionaryToString appendFormat:@"%@,", 
         ([item objectForKey:@"Street"]) ? [item objectForKey:@"Street"] : @"" ];
        // ...
        NSLog(@"MutableString: %@", addressDictionaryToString);
    }
    

    它检查一个值是否存在,如果存在则插入该值,或者只是一个空字符串(导致“值、值、值...”)。还要记住,逗号后面不应该有空格,所以我从这个例子中删除了它。

    【讨论】:

    • 谢谢约书亚!我有另一种方法来删除空格并将“”替换为 %20 进行地理编码
    • :-) 这是您接受回答的问题的百分比(从而给回答者更多的业力点)。它激励人们回答更多你的问题。但是,仔细观察确实表明您的一些问题仍未得到解答,所以这不是您的错。 :-)
    • 当你运行代码时 [addressDictionaryToString appendFormat:@"%@,", ([item objectForKey:@"Street"]) ? [项目对象ForKey:@“街道”]:@“”];格式化的字符串是否保存到 addressDictionaryToString NSMutableString 中?
    • 是的。该行的开头显示了这一点。您正在附加格式。当需要为 %@ 占位符提供值时,您将使用 C 三元运算符 (en.wikipedia.org/wiki/Conditional_operator) 来替换值(如果存在)或空字符串(如果不存在)。
    • 当然,但是代码开始变得难以阅读。看看我在哪里评论了“// ...”?我的意思是,您可以复制上面的行并更改键。这使得通过复制行来添加新字段/键更容易,并且更容易在调试器中阅读和单步执行。
    【解决方案2】:

    不完全确定您要做什么,但这是:

    NSDictionary *d=[NSDictionary dictionaryWithObject:[NSNull null] forKey:@"ns"];
    NSString *n=[@"Steve " stringByAppendingFormat:@"%@",[d objectForKey:@"ns"]];
    NSLog(@"%@",n);
    

    ...打印:

    Steve <null>
    

    如果键本身不存在,那么当您尝试获取不存在的键的值时,它将引发异常。在这种情况下,唯一的办法是在尝试使用它来检索值之前检查每个字典中的键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多