33

我编写了这个简单的代码来尝试NSArrays 的新 Objective-C 文字语法:

NSArray *array = @[@"foo"];
NSLog(@"%@", array[0]); 

第一行工作正常,但下标导致错误:

在“NSArray *”类型的对象上未找到读取数组元素的预期方法

只是想知道我是否做错了什么,或者文字是否还没有完全实现。我正在使用 Apple LLVM 4.0 进行编译并使用 iOS 5 SDK。

这也是错误的屏幕截图。

错误

4

7 回答 7

36

您必须使用 iOS 6 或 OS X 10.8 SDK 进行编译——否则 Foundation 对象没有文字语法的下标位的必要方法。* 特别是在这种情况下,下标期望objectAtIndexedSubscript:NSArray,这是为与此编译器功能交互而创建的新方法。不过,新语法中与对象创建有关的部分应该可以正常工作——我认为这不需要任何新方法。

进一步阅读http://clang.llvm.org/docs/ObjectiveCLiterals.html


*我基于 borrrden 进行的一些研究:https ://stackoverflow.com/a/11407844/603977

我在这个答案上得到了很多支持,我真的觉得这是建立在 borrrden 的基础上的。请,如果您认为我的回答值得一票,请点击并在那里投票。

于 2012-07-11T08:06:31.237 回答
15

如果您的目标不是 iOS 6 或 OS X 10.8,我想指出,让下标工作仍然非常容易。您所要做的就是将所需的方法添加为您希望下标工作的类的类别,并适当地实现这些方法。因此,将方法添加到以下类中:

NSArray- (id)objectAtIndexedSubscript: (NSUInteger)index;

NSMutableArray- (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;

NSDictionary- (id)objectForKeyedSubscript: (id)key;

NSMutableDictionary- (void)setObject: (id)obj forKeyedSubscript: (id)key;

实现这一点很简单,只需为类调用适当的方法即可。例如,要在 NSArray 上实现下标,您只需实现:

- (id) objectAtIndexedSubscript:(NSUInteger)index{
    return [self objectAtIndex:index];
}

我能看到的唯一缺点是您需要确保将您的类别导入任何打算使用下标的类。当然,您可以通过#import在前缀标头中包含 来绕过该要求,通常是文件:<appname>-Prefix.pch。(感谢 Josh Caswell 指出这一点)。

一个好处是您可以更改下标方法以满足您的需要。例如,Apple 不允许您使用下标向 NSMutableArray 添加/删除对象,但这可以很容易地完成:

 - (void) setObject:(id)obj atIndexedSubscript:(NSUInteger)index{
    if (index < self.count){
        if (obj)
            [self replaceObjectAtIndex:index withObject:obj];
        else
            [self removeObjectAtIndex:index];
    } else {
        [self addObject:obj];
    }
}
于 2012-07-25T20:21:00.197 回答
2

我从这个链接得到以下代码:

您只需将此类别添加到NSObject集合下标即可。我把它放在我的 .pch 文件中。

// Add support for subscripting to the iOS 5 SDK.
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSObject (SubscriptingSupport)

- (id)objectAtIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
- (id)objectForKeyedSubscript:(id)key;

@end
#endif

当然,您需要 XCode 4.4 中已有的最新版本的 CLANG。

于 2012-08-17T00:21:56.447 回答
1

我遇到了同样的问题,但不是缺少 iOS 版本的 b/c .. 但这仅仅是因为原始数组设置为 anNSArray而不是NSMutableArray. 将其更改NSMutableArray为为我修复

于 2013-04-17T12:35:33.283 回答
0

我添加这个是因为这是一个常见的错误,截至 7/2015 仍然存在于 Xcode 中,并且很难弄清楚如何解决它。

我在尝试调用对象上的方法而没有创建对象实例时收到此错误。我的解决方案是创建对象的一个​​实例,然后调用该对象实例的属性上的方法。

示例:什么不起作用:[self methodCall:arrayItem](参见下面的完整示例)

[self tappedUser:self.activities[indexPath.row].followItem.user.givenName];

什么解决了它: ObjectClass newObject = arrayItem; [self methodCall:newObject] (参见下面的完整示例)

FollowActivityItem *followItem = self.activities[indexPath.row];
[self tappedUser:followItem.user.givenName];
于 2015-07-17T17:51:50.610 回答
0

添加 到您的 h 文件中#import <Foundation/Foundation.h>,并使用NSMutableArray

于 2016-04-13T12:43:50.983 回答
-1

如果有人像我一样在 Xcode 9.3 beta 4 中使用一些遗留的 Objective-C 代码遇到这个错误后进入这个旧线程,这里是我的修复。

更新:

@property (nonatomic, strong) id<CustomClass> myObject;

至:

@property (nonatomic, strong) NSMutableArray<CustomClass> *myObject;
于 2018-03-23T22:17:02.320 回答