33

NSArraysの新しいObjective-Cリテラル構文を試すために、この単純なコードを作成しました。

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

最初の行は正常に機能しますが、添え字を付けるとエラーが発生します。

タイプ'NSArray*'のオブジェクトに見つからない配列要素を読み取るために必要なメソッド

私が何か間違ったことをしたのか、それともリテラルがまだ完全に実装されていないのか疑問に思っています。Apple LLVM 4.0でコンパイルし、iOS5SDKを使用しています。

これもエラーのスクリーンショットです。

エラー

4

7 に答える 7

36

iOS6またはOSX10.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

iOS6またはOSX10.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];
    }
}
于 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

もちろん、すでにXCode4.4に含まれている最新バージョンのCLANGが必要になります。

于 2012-08-17T00:21:56.447 に答える
1

私は同じ問題を抱えていましたが、それはiOSバージョンが不足しているb / cではありませんでした..しかし、それは単に元の配列がではNSArrayなくとして設定されていたためNSMutableArrayです。NSMutableArray私のためにそれを修正するためにそれを変更する

于 2013-04-17T12:35:33.283 に答える
0

これは、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];
于 2015-07-17T17:51:50.610 に答える
0

#import <Foundation/Foundation.h>hファイルに追加 し、NSMutableArray代わりに使用します

于 2016-04-13T12:43:50.983 に答える
-1

私のようにレガシーObjective-Cコードを使用してXcode9.3ベータ4でこのエラーが発生した後、誰かがこの古いスレッドに到達した場合、これが私の修正です。

アップデート:

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

に:

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