【问题标题】:Accessing NSArray's items with subscript使用下标访问 NSArray 的项目
【发布时间】:2011-12-27 17:28:40
【问题描述】:

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

NSArray *obj = [NSArray ...]; id item = obj[0];

【问题讨论】:

    标签: objective-c cocoa xcode4 nsarray


    【解决方案1】:

    接受的答案(虽然当时是正确的)现在已经过时了。从 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 目前有 4 个元素,mutableArray[5] = object 就可以了。但是[mutableArray replaceObjectAtIndex:5 withObject:object] 会引发异常。
    • 啊,有趣。我确实想知道他们为什么要创建新方法而不是让新语法调用旧方法。
    • 当然,它适用于 Xcode 4.5(我认为是 4.1)及更高版本附带的 clang 版本。除非您习惯性地独立于 Xcode 版本安装自己的 clang 版本,否则两者是等价的。
    【解决方案2】:

    这是不可能的,不幸的是(或不是)。 您唯一的选择是围绕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 在下面的评论)

    【讨论】:

    • 请注意,是否有针对这种情况的任何开源包装器?
    • 如何重载 NSArray 的任何运算符?即使使用 ObjC++,它也不允许我重载那些。
    • @David:你没有。 sergio 的建议是“围绕 NSArray 构建一个 C++ 包装器并覆盖 operator[]”。
    • 该信息现在已经过时了,从 Xcode 4.5 开始,您可以使用 array[index] 访问 NSArray 项目。
    • @NickLockwood:谢谢你的评论。我已经编辑了我的答案以包含对 Xcode 4.5 发行说明的引用。
    【解决方案3】:

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

    【讨论】:

    • +1。要注意它是整个数组的副本,因此需要付出代价。
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多