【问题标题】:Add values in NSMutableDictionary in iOS with Objective-C使用 Objective-C 在 iOS 中的 NSMutableDictionary 中添加值
【发布时间】:2011-06-29 11:33:34
【问题描述】:

我正在开始 objective-c 开发,我想问一下实现键和值列表的最佳方法。

在 Delphi 中有 TDictionary 类,我这样使用它:

myDictionary : TDictionary<string, Integer>;

bool found = myDictionary.TryGetValue(myWord, currentValue);
if (found)
{
    myDictionary.AddOrSetValue(myWord, currentValue+1);
} 
else
{
    myDictionary.Add(myWord,1);
}

如何在objective-c 中做到这一点?有没有和上面提到的AddOrSetValue() or TryGetValue()等价的功能?

谢谢。

【问题讨论】:

    标签: ios objective-c nsmutabledictionary


    【解决方案1】:

    您希望按照以下方式实现您的示例:

    编辑:

    //NSMutableDictionary myDictionary = [[NSMutableDictionary alloc] init];
    NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];
    
    NSNumber *value = [myDictionary objectForKey:myWord];
    
    if (value)
    {
        NSNumber *nextValue = [NSNumber numberWithInt:[value intValue] + 1];
        [myDictionary setObject:nextValue  forKey:myWord];
    } 
    else
    {
        [myDictionary setObject:[NSNumber numberWithInt:1] forKey:myWord]
    }
    

    (注意:您不能将整数或其他原语直接存储在NSMutableDictionary 中,因此需要将它们包装在NSNumber 对象中,并确保在完成后调用[myDictionary release]字典)。

    【讨论】:

      【解决方案2】:

      其他答案是正确的,但现在有更现代的语法。而不是:

      [myDictionary setObject:nextValue  forKey:myWord];
      

      你可以简单地说:

      myDictionary[myWord] = nextValue;
      

      同样,要获取值,可以使用myDictionary[key] 获取值(或nil)。

      【讨论】:

      • 上面提到的简化形式,通常解决OCLint(度量静态代码分析)的问题。谢谢@jesse-rusak :)
      【解决方案3】:

      是的:

      - (id)objectForKey:(id)key;
      - (void)setObject:(id)object forKey:(id)key;
      

      setObject:forKey: 用相同的键覆盖任何现有对象;如果对象不存在,objectForKey: 返回nil

      编辑:

      例子:

      - (void)doStuff {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
      
        [dict setObject:@"Foo" forKey:@"Key_1"]; // adds @"Foo"
        [dict setObject:@"Bar" forKey:@"Key_2"]; // adds @"Bar"
      
        [dict setObject:@"Qux" forKey:@"Key_2"]; // overwrites @"Bar"!
      
        NSString *aString = [dict objectForKey:@"Key_1"]; // @"Foo"
        NSString *anotherString = [dict objectForKey:@"Key_2"]; // @"Qux"
        NSString *yas = [dict objectForKey:@"Key_3"]; // nil
      }
      

      重新编辑:对于具体示例,存在更紧凑的方法:

      [dict
        setObject:
          [NSNumber numberWithInteger:([[dict objectForKey:@"key"] integerValue] + 1)]
        forKey:
          @"key"
       ];
      

      为了可读性而疯狂的缩进。

      【讨论】:

      • 嗨,你能在@"Bar" forKey:@"Key_2" 上附加说 @"Qux" 吗?你会怎么做?
      • @GerardGrundy:这真的是一个完全不同的问题。但是请检查 stringByAppendingString 的文档:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2011-01-27
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多