是否可以使用[idx]访问NSArray的对象?我有一个使用[]样式索引的标准库,我不想重写整个库以适应ObjC的objectAtIndex:方法。
如同,NSArray *obj = [NSArray ...]; id item = obj[0];
答案 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然后使用下标运算符。