使用下标访问NSArray的项目

时间:2011-11-12 17:54:04

标签: objective-c cocoa xcode4 nsarray

是否可以使用[idx]访问NSArray的对象?我有一个使用[]样式索引的标准库,我不想重写整个库以适应ObjC的objectAtIndex:方法。

如同,NSArray *obj = [NSArray ...]; id item = obj[0];

3 个答案:

答案 0 :(得分:20)

接受的答案(当时是真的)现在已经过时了。从Xcode 4.5开始,您现在可以使用:

设置和获取NSArray元素
id object = array[5]; // equivalent to [array objectAtIndex:5];
mutableArray[5] = object; // equivalent to [mutableArray replaceObjectAtIndex:5 withObject:object];

您也可以使用以下方法为NSDictionaries执行相同操作:

id object = dict[@"key"]; // equivalent to [dict objectForKey:@"key"];
mutableDict[@"key"] = object; // equivalent to [mutableDict setObject:object forKey:@"key"];

更酷的是,您现在可以使用类似JSON的语法创建数组和字典对象:

NSArray *array = @[@"value1", @"value2"]; // equivalent to [NSArray arrayWithObjects:@"value1", @"value2", nil];
NSDictionary *dict = @{@"key1":@"value1", @"key2":@"value2"}; // equivalent to [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

同样,像NSNumber这样的盒装值现在可以用简写语法编写:

NSNumber *intNumber = @5; // equivalent to [NSNumber numberWithInteger:5];
NSNumber *boolNumber = @YES; // equivalent to [NSNumber numberWithBool:YES];
NSNumber *someNumber = @(variable); // equivalent to [NSNumber numberWithWhatever:variable];

编辑:

比我的更详细的答案:What are the details of "Objective-C Literals" mentioned in the Xcode 4.4 release notes?

编辑2:

要明确的是,虽然在Xcode 4.5之前没有添加此功能,但它适用于iOS 4.3及更高版本,因此如果您需要支持较旧的iOS版本,则不必避免使用此功能。

编辑3:

为了迂实精确,它适用于Apple LLVM编译器4.1及更高版本。 AKA Xcode 4.5附带的版本。

答案 1 :(得分:1)

不幸(或不),这是不可能的。 您唯一的选择是围绕NSArray构建C ++包装并覆盖operator[]。 然后,使用该包装器的所有文件都应该是Objective-C ++(即使用.mm扩展名)才能正确编译。

编辑:

此答案的更新。从Xcode 4.5 / iOS 6开始,可以使用下标符号来访问NSArray元素:

 NSArray* array = ...;
 id val = array[i];

这是官方的Xcode 4.5 release notes措辞:

  

iOS 6.0支持使用'[]'语法与Objective-C容器对象进行下标。

(感谢Nick Lockwood在下面的评论)

答案 2 :(得分:0)

不。但是,您可以extract the NSArray's contents into a C array然后使用下标运算符。