更方便的NSArray和NSDictionary访问

时间:2011-09-08 15:43:43

标签: objective-c

请注意,这只是一个学术问题。

在Ruby中,您可以方便地访问数组和字典(哈希)元素:

value = myHash['myKey']

在Objective C中,您需要一个方法调用:

value = [myDict objectForKey:@"myKey"];

如何覆盖某种类型的括号或定义宏以使Objective C语法更接近Ruby?

4 个答案:

答案 0 :(得分:4)

您要做的事情需要一种称为“运算符重载”的语言功能。 Objective-C不允许运算符重载,因为语言的设计者认为运算符重载比有用的更有害。

C ++确实允许运算符重载,因此获得所需语法的一种方法是将集合包装在C ++类中并使用它们。要切换到Objective-C ++,只需将实现文件的扩展名从.m更改为.mm。

就个人而言,我建议不要在集合中使用C ++包装器,因为它会让你的代码更难以让其他Objective-C程序员阅读,它会破坏Xcode的一些更高级的功能。例如,您将无法再使用重构工具,因为Xcode将无法正确解析您的代码。

答案 1 :(得分:4)

只是更新:

从iOS 6开始我猜你可以使用这样的语法:

value = dictionary[@"key"];

这相当于

value = [dictionary objectForKey:@"key"];

此外,如果我们谈论NSMutableDictionary,您可以将新对象添加到字典中,如下所示:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];
dictionary[@"a"] = @"A";
NSLog(@"%@",dictionary[@"a"]);

答案 2 :(得分:3)

其他答案告诉你为什么你不能这样做 - 或者如何解决它,但Objective-C是一种冗长的语言 - 并且使用描述性名称是愉快的一部分语言。当然,你输入了更多的字母,但是代码完成后,写入的速度几乎没有任何慢,你可以确切地看到你在做什么。

答案 3 :(得分:1)

切换到Objective-C ++,为NSDictionary和NSMutableDictionary定义C ++包装类,并覆盖运算符,即数组下标运算符。