Erro do compilador “método esperado não encontrado” ao usar o subscrito no NSArray

Eu escrevi este código simples para testar a nova syntax literal do Objective-C para NSArray s:

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

A primeira linha funciona bem, mas a assinatura resulta em um erro:

Método esperado para ler o elemento da matriz não encontrado no object do tipo ‘NSArray *’

Só estou me perguntando se fiz algo errado ou se os literais ainda não foram totalmente implementados. Estou compilando com o Apple LLVM 4.0 e usando o iOS 5 SDK.

Aqui está uma captura de canvas do erro também.

Erro

Você precisa estar compilando com os SDKs do iOS 6 ou OS X 10.8 – caso contrário, os objects Foundation não terão os methods necessários para o bit de subscrito da syntax literal. * Especificamente, neste caso, o subscripting espera que objectAtIndexedSubscript: seja implementado pelo NSArray , e esse é um novo método que foi criado para interagir com esse recurso de compilador. As partes da nova syntax que apenas tem a ver com a criação de objects devem funcionar bem – não acredito que isso exija novos methods.

Outras leituras em http://clang.llvm.org/docs/ObjectiveCLiterals.html


* Eu baseio isso em um pouco de pesquisa realizada por borrrden: https://stackoverflow.com/a/11407844/603977

Eu recebi muitos votos positivos nessa resposta, o que eu realmente acho que é baseado em borradas. Por favor, se você acha que minha resposta vale a pena, clique e vote nela também.

Se você não está segmentando o iOS 6 ou o OS X 10.8, eu gostaria de salientar que ainda é incrivelmente fácil fazer com que a assinatura funcione. Tudo o que você precisa fazer é adicionar os methods necessários como uma categoria para as classs que você deseja que o trabalho de assinatura trabalhe e implementar esses methods adequadamente. Então adicione às seguintes classs os methods:

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;

Implementar isso é simples, chamando o método apropriado para a class. Por exemplo, para implementar o subscripting no NSArray, basta implementar:

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

A única desvantagem que posso ver é que você precisa ter certeza de importar sua categoria para qualquer class que pretenda usar o subscripting. Claro, você pode contornar esse requisito incluindo o #import no header do prefixo, geralmente o arquivo: -Prefix.pch . (obrigado Josh Caswell por apontar isso).

Uma vantagem é que você pode alterar os methods de assinatura para atender às suas necessidades. Por exemplo, a Apple não permite adicionar / remover objects ao NSMutableArray usando o subscripting, mas isso pode ser feito com bastante facilidade:

  - (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]; } } 

Eu tenho o mesmo problema, mas não era b / c de uma falta da versão do iOS .. mas foi simplesmente porque o array original foi definido como um NSArray vez de um NSMutableArray . Mudando para o NSMutableArray consertou para mim

Eu tenho o seguinte código deste link :

Você pode simplesmente adicionar essa categoria ao NSObject e a NSObject collections funcionará. Eu coloquei no meu arquivo .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 )key; - (id)objectForKeyedSubscript:(id)key; @end #endif 

Claro que você precisará da versão mais nova do CLANG que já está no XCode 4.4.

Estou adicionando isso porque este é um erro comum que ainda existe no Xcode a partir de 7/2015 e não é fácil descobrir como resolvê-lo.

Recebi este erro ao tentar chamar um método em um object sem ter criado uma instância do object. Minha solução foi criar uma instância do object e, em seguida, chamar o método na propriedade na instância desse object.

Exemplo: O que não funcionou: [self methodCall: arrayItem] (veja o exemplo completo abaixo)

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

O que corrigiu: ObjectClass newObject = arrayItem; [self methodCall: newObject] (veja o exemplo completo abaixo)

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

adicione #import ao seu arquivo h, e use um NSMutableArray

Se alguém chegar a este segmento antigo depois de receber este erro no Xcode 9.3 beta 4 com algum código herdado Objective-C como eu fiz, aqui estava a minha correção.

Atualizar:

 @property (nonatomic, strong) id myObject; 

Para:

 @property (nonatomic, strong) NSMutableArray *myObject;