Ошибка компилятора "ожидаемый метод не найден" при использовании индекса на 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