NSArray
sの新しいObjective-Cリテラル構文を試すために、この単純なコードを作成しました。
NSArray *array = @[@"foo"];
NSLog(@"%@", array[0]);
最初の行は正常に機能しますが、添え字を付けるとエラーが発生します。
タイプ 'NSArray *'のオブジェクトに見つからない配列要素を読み取るために必要なメソッド
私が何か間違ったことをしたのか、それともリテラルがまだ完全に実装されていないのか疑問に思っています。 Apple LLVM 4.0でコンパイルし、iOS 5SDKを使用しています。
これもエラーのスクリーンショットです。
IOS6またはOSX 10.8 SDKを使用してコンパイルする必要があります。そうしないと、Foundationオブジェクトにリテラル構文の添え字ビットに必要なメソッドがありません。*特にこの場合、添え字はobjectAtIndexedSubscript:
が実装されることを想定しています。 NSArray
によって、これはこのコンパイラ機能と対話するために作成された新しいメソッドです。ただし、オブジェクトの作成に関係する新しい構文の部分は正常に機能するはずです。新しいメソッドが必要になるとは思いません。
さらに読む http://clang.llvm.org/docs/ObjectiveCLiterals.html
*私はこれをborrrdenによって実行された少しの調査に基づいています: https://stackoverflow.com/a/11407844/603977
私はこの答えに多くの賛成を得ました、それは私が本当にborrrdenのものに基づいていると感じます。私の答えが賛成する価値があると思うなら、クリックしてそこにも投票してください。
IOS6またはOSX 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
を含めることで、この要件を回避できます。 (それを指摘してくれたJoshCaswellに感謝します)。
1つの利点は、必要に応じて添え字の方法を変更できることです。たとえば、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];
}
}
このリンク から次のコードを取得しました:
このカテゴリを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
もちろん、すでにXCode4.4に含まれている最新バージョンのCLANGが必要になります。
同じ問題が発生しましたが、iOSバージョンが不足しているb/cではありませんでした。しかし、元の配列がNSArray
ではなくNSMutableArray
として設定されていたためです。 NSMutableArray
に変更すると修正されました
追加 #import <Foundation/Foundation.h>
をhファイルに追加し、代わりにNSMutableArray
を使用します
これは2015年7月の時点で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];