我正在寻找一个类似于C#的KeyValuePair的Objective C类(即使没有泛型)。任何有第一个/第二个对象的东西。我可以创造我自己的没有问题,但我想如果一个已经存在,那么就没有必要重新发明轮子了。我自己找不到任何运气......有人知道吗?
答案 0 :(得分:11)
所以基本上就像一个hashmap,对吧?
来自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"}
要记住的事情:
答案 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 为您完成。