Ошибка компилятора "ожидаемый метод не найден" при использовании индекса на NSArray

Я написал этот простой код, чтобы опробовать новый синтаксис Objective-C для NSArray s:

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

Первая строка работает нормально, но в подписи написано сообщение об ошибке:

Ожидаемый метод чтения элемента массива, который не найден на объекте типа NSArray *

Просто интересно, что я сделал что-то не так, или если литералы еще не были полностью реализованы. Я собираюсь с Apple LLVM 4.0 и с помощью IOS 5 SDK.

Здесь также снимок экрана об ошибке.

Error

Ответ 1

Вы должны компилироваться с SDK iOS 6 или OS X 10.8 - в противном случае объекты Foundation не имеют необходимых методов для бит субскрипции литерального синтаксиса. * В частности, в этом случае subscriptip ожидает objectAtIndexedSubscript:, который будет реализован NSArray, и что новый метод, который был создан для взаимодействия с этой функцией компилятора. Части нового синтаксиса, которые просто связаны с созданием объекта, должны работать нормально, однако - я не считаю, что для этого требуются новые методы.

Дальнейшее чтение на http://clang.llvm.org/docs/ObjectiveCLiterals.html


* Я основываю это на немного исследований, выполненных borrrden: fooobar.com/questions/34333/...

У меня много ответов на этот ответ, который я действительно чувствую, основанный на borrrden's. Пожалуйста, если вы считаете, что мой ответ стоит upvote, щелкните и проголосуйте там тоже.

Ответ 2

Если вы не нацеливаетесь на 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. (спасибо Джошу Касуэлу за указание на это).

Один потенциал - вы можете изменить методы подписи, чтобы удовлетворить ваши потребности. Например, 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];
    }
}

Ответ 3

Я получил следующий код эту ссылку:

Вы можете просто добавить эту категорию в 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

Конечно, вам понадобится новейшая версия CLANG, которая уже находится в XCode 4.4.

Ответ 4

У меня возникла такая же проблема, но тогда это не было b/c отсутствующей версии iOS.. но это было просто потому, что исходный массив был установлен как NSArray, а не NSMutableArray. Изменение его на NSMutableArray исправило его для меня

Ответ 5

Я добавляю это, потому что это распространенная ошибка, которая все еще существует в Xcode по состоянию на 7/2015, и нелегко понять, как ее разрешить.

Я получил эту ошибку при попытке вызвать метод для объекта, не создав экземпляр объекта. Моим решением было создать экземпляр объекта, а затем вызвать метод в свойстве экземпляра этого объекта.

Пример: Что не сработало: [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];

Ответ 6

добавить #import <Foundation/Foundation.h> в ваш h файл и вместо этого используйте NSMutableArray