Objective C - KeyValuePair类?

时间:2010-08-20 13:42:26

标签: objective-c iphone

我正在寻找一个类似于C#的KeyValuePair的Objective C类(即使没有泛型)。任何有第一个/第二个对象的东西。我可以创造我自己的没有问题,但我想如果一个已经存在,那么就没有必要重新发明轮子了。我自己找不到任何运气......有人知道吗?

4 个答案:

答案 0 :(得分:11)

所以基本上就像一个hashmap,对吧?

Use NSMutableDictionary

来自here的示例:

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

// Add objects to a dictionary indexed by keys

[dictionary setObject:@"A Book about the Letter A" forKey:@"A"];
[dictionary setObject:@"A Book about the Letter B" forKey:@"B"];
[dictionary setObject:@"A Book about the Letter C" forKey:@"C"];

// Retrieve an object from a dictionary with a key

NSLog([dictionary objectForKey:@"B"]);

// Release a dictionary

[dictionary release];

答案 1 :(得分:4)

简单的NSArray怎么样?

NSArray* kvp = [NSArray arrayWithObjects: key, value, nil];
// or, using boxed literals,
NSArray* kvp = @[key, value];
...
NSObject* key = [kvp firstObject];
NSObject* value = [kvp lastObject];

你可以创建一个函数来包装+arrayWithObjects:(并处理一个nil键或值的情况,这会使简单方法绊倒)

访问NSArray的元素可能比NSDictionary更快。

答案 2 :(得分:1)

使用普通C结构怎么样?它比写整个课程“更快”。

typedef struct KeyValuePair {
     const char *key;
     const char *value;
} KeyValuePair;

//init like this
KeyValuePair kvp = {"yourkey", "yourvalue"}

要记住的事情:

  • 结构按值传递。
  • ARC阻止使用具有结构的ObjC对象,但仍支持C基元。
  • 您无法将结构添加到ObjC集合类(NSArray,NSDictionary等)。

答案 3 :(得分:0)

除了定义自己的包含“键”和“值”属性的模型对象之外,您最好的方法是使用普通的旧 NSDictionary,并享受 Objective-C 的一些隐藏优点。

首先,您可以使用速记 Obj-C 字面量来创建一个键值对,如下所示:

NSDictionary *keyValuePair = @{myName:myAge}; // where myName and myAge are obj-C object instances serving as key and value respectively. 

或者,使用常量:@{@"Motti", @YES};

这是一个真正的 Obj-C 实例引用,你可以在任何地方使用。

然而...这里真正的享受是,您不会因为 OBj-C 类集群而使用 NSDictionary 损失性能。这是我的 Xcode 调试器中的一个片段:

 po [@{@"Motti":@YES} class]
__NSSingleEntryDictionaryI

你问什么是__NSSingleEntryDictionaryI?它是 NSDictionary 的一个特殊隐藏子类,可以在 NSDictionary 可以使用的任何地方使用 - 全能的 Obj-C 决定实例化,注意我的字典只有一个键和一个值的事实。这是一个高度优化的类,没有哈希表——一个真正的键值对类。

您应该永远尝试自己[[__NSSingleEntryDictionaryI alloc] init],因为 Apple 从来没有义务承认它的存在,并且不会在 Foundation API 的任何地方公开其定义 - 但请确保它是只要语言合适,就会被广泛使用。

所以...只需使用超级舒适的 NSDictionary,其余的让 Objective-C 为您完成。