【发布时间】:2011-12-27 17:28:40
【问题描述】:
是否可以使用 [idx] 访问 NSArray 的对象?我有一个使用 [] 样式索引的标准库,我不想重写整个库以适应 ObjC 的 objectAtIndex: 方法。
如NSArray *obj = [NSArray ...]; id item = obj[0];
【问题讨论】:
标签: objective-c cocoa xcode4 nsarray
是否可以使用 [idx] 访问 NSArray 的对象?我有一个使用 [] 样式索引的标准库,我不想重写整个库以适应 ObjC 的 objectAtIndex: 方法。
如NSArray *obj = [NSArray ...]; id item = obj[0];
【问题讨论】:
标签: objective-c cocoa xcode4 nsarray
接受的答案(虽然当时是正确的)现在已经过时了。从 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 及更高版本。又名 Xcode 4.5 附带的版本。
【讨论】:
mutableArray[5] = object; // equivalent to [mutableArray replaceObjectAtIndex:5 withObject:object]; 不正确。相当于setObject:(id)anObject atIndexedSubscript:(NSUInteger)index
mutableArray[5] = object 就可以了。但是[mutableArray replaceObjectAtIndex:5 withObject:object] 会引发异常。
这是不可能的,不幸的是(或不是)。
您唯一的选择是围绕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 在下面的评论)
【讨论】:
operator[]”。
不。但是,您可以使用extract the NSArray's contents into a C array,然后使用下标运算符。
【讨论】: