19

I'm starting objective-c development and I would like to ask the best way to implement a list of keys and values.

In Delphi there is the class TDictionary and I use it like this:

myDictionary : TDictionary<string, Integer>;

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

How can I do it in objective-c? Is there equivalent functions to the above mentioned AddOrSetValue() or TryGetValue()?

Thank you.

3 Answers 3

55

You'd want to implement your example along these lines:

EDIT:

//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]
}

(Note: you can't store ints or other primitives directly in a NSMutableDictionary, hence the need to wrap them in an NSNumber object, and make sure you call [myDictionary release] when you've finished with the dictionary).

Sign up to request clarification or add additional context in comments.

Comments

13

The other answers are correct, but there is more modern syntax for this now. Rather than:

[myDictionary setObject:nextValue  forKey:myWord];

You can simply say:

myDictionary[myWord] = nextValue;

Similarly, to get a value, you can use myDictionary[key] to get the value (or nil).

1 Comment

The simplified form mentioned above, usually solves problems OCLint (metric static code analysis). Thanks @jesse-rusak :)
6

Yep:

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

setObject:forKey: overwrites any existing object with the same key; objectForKey: returns nil if the object doesn't exist.

Edit:

Example:

- (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
}

Reedit: For the specific example there exists a more compact approach:

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

Crazy indentation for readability.

2 Comments

Hi are you able to append say @"Qux" onto @"Bar" forKey:@"Key_2"? How would you do this?
@GerardGrundy: That's really a completely different question. But check the docs for stringByAppendingString:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.