Objective c 目标C-KeyValuePair类?

Objective c 目标C-KeyValuePair类?,objective-c,iphone,Objective C,Iphone,我想在Objective C中寻找一个类似于C#的KeyValuePair的类(即使没有泛型)。只要有第一个/第二个对象。我可以毫无问题地创建自己的轮子,但我认为如果已经有了,那么就没有必要重新发明轮子。我自己也没找到一个。。。有人知道吗?基本上就像一个hashmap,对吗 示例来自: 使用普通C结构怎么样?这比写一整堂课“快” typedef struct KeyValuePair { const char *key; const char *value; } KeyVa

我想在Objective C中寻找一个类似于C#的KeyValuePair的类(即使没有泛型)。只要有第一个/第二个对象。我可以毫无问题地创建自己的轮子,但我认为如果已经有了,那么就没有必要重新发明轮子。我自己也没找到一个。。。有人知道吗?

基本上就像一个hashmap,对吗

示例来自:


使用普通C结构怎么样?这比写一整堂课“快”

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

//init like this
KeyValuePair kvp = {"yourkey", "yourvalue"}
要记住的事情:

  • 结构是按值传递的
  • ARC阻止将ObjC对象与结构一起使用,但仍然支持C原语
  • 不能将结构添加到ObjC集合类(NSArray、NSDictionary等)

一个简单的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更快。

除了定义自己的包含“键”和“值”属性的模型对象之外,最好的方法是使用普通的旧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实例参考,您可以在任何地方使用

但是。。。这里真正的处理方法是,使用
NSDictionary
不会因为OBj-C类集群而失去性能。下面是我的Xcode调试器的一个片段:

 po [@{@"Motti":@YES} class]
__NSSingleEntryDictionaryI
你问什么是
\uu NSSingleEntryDictionaryI
?它是
NSDictionary
的一个特殊的隐藏子类,在NSDictionary可以的任何地方都可以使用它,全能的Obj-C决定实例化它,注意到我的dictionary只有一个键和一个值。这是一个高度优化的类,没有哈希表——一个真正的键值对类

您应该对<代码> [[Al] NSnLeLeNyTyCyrasyIOLC/init ] /<代码>进行尝试,因为苹果从不支持它的存在,并且不在基础API中任何地方公开它的定义,但是确保它在语言适合的时候被广泛使用。
所以。。。只需使用超级舒适的
NSDictionary
,然后让Objective-C为您完成其余的工作。

就像这样,但只有一个实例(hashmap/dictionary包含多个键/值)。我正在寻找一个只有一个键/值的类。你可以考虑只创建你自己的“配对”类。或者,您可以将NSMutableDictionary子类化,并在子类化字典中一次只强制执行一对对象的规则。没有某种标准的“NSPair”对象似乎有些奇怪……不幸的是,C struct不能很好地与ARC配合使用,您无法将它们放入NSArray/NSDictionary和许多其他地方。差不多useless@BryanChen是的,但是如果您需要某种容器来传递,而不必创建整个类,那么结构仍然是有用的。ARC禁止将ObjC对象与结构一起使用,但仍然支持C原语。实际上,您是以C/C++的方式而不是ObjC的方式来执行此操作。NSArray的语义不支持“键”或“值”的概念。你用一些你只知道作为程序员的东西来重载定义,这不是很好。然而,还有另一类。。。这确实支持了这一概念,并且在文本和性能方面服务得更好。请看下面我的答案。我接受你的观点,但凯尔要求“只要有第一个/第二个对象的东西”。字典没有与键值对相同的语义,因此其效率或其他方面并不相关。请参阅我的完整答案,因为NSDictionary确实支持键值对语义和性能,使用带有NSDictionary特定子类的“类群集”(u NSSingleEntryDictionaryI)当需要单对词典时自动创建。我已经看到了您的完整答案,更重要的是,我看到了问题,Kyle要求类似.NET的东西。这个简单的类只有两个感兴趣的属性——Key和Value,可以像
thing.Key
一样使用。对于NSDictionary,它(我相信)必须是
[[thing allKeys]firstObject]
NSDictionary是键值对的集合;这并不意味着它是一个键值对。
 po [@{@"Motti":@YES} class]
__NSSingleEntryDictionaryI