请注意,这只是一个学术问题。
在Ruby中,您可以方便地访问数组和字典(哈希)元素:
value = myHash['myKey']
在Objective C中,您需要一个方法调用:
value = [myDict objectForKey:@"myKey"];
如何覆盖某种类型的括号或定义宏以使Objective C语法更接近Ruby?
答案 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 ++包装类,并覆盖运算符,即数组下标运算符。