23

Xcode 4.4 で新しいプロジェクトを作成し、次の行を追加すると:

NSDictionary *test = @{ @"key" : @"test value" };
NSString *value = test[@"key"];
NSLog(@"value is: %@", value);

警告なしでコンパイルされ、期待どおりに実行されます。

同じ行を既存のプロジェクトに追加すると、コンパイラ エラーが発生します。

NSString *value = test[@"key"]; <-- Expected method to read dictionary element not found on object of type 'NSDictionary *'

両方のプロジェクトのターゲット ビルド設定を比較しましたが、何も浮かびませんでした。

更新: 正常にコンパイルされた新しいプロジェクトは OSX 用でした。上記の行でiOS用の別の新しいものを試してみましたが、既存の(iOS)プロジェクトと同じようにコンパイルに失敗しました。

4

1 に答える 1

48

これは、古いプロジェクトと新しいプロジェクトとは関係ありませんが、使用する SDK の要因です。あなたが直面している問題は、これはコンパイラの機能ですが、SDK のサポートが必要なことです。iOS 5 SDK はそのサポートを提供しませんが、iOS 6 SDK は提供します。

そのため、iOS 6 SDK のみを使用する必要があります。iOS 5 SDK でオブジェクトの添え字を使用する場合は、このまま読み進めてください。

ヘッダー ファイルを追加して、コンパイラが呼び出しを試みるようにするだけです。実装を追加する必要はありません。によって自動的に処理されarcliteます。(ARC を使用していない場合は、リンカーに強制的に を含めるarclite必要があります。ただし、実際に切り替える必要はありません。)

新しいインターフェイス ファイルNSObject+subscripts.hを作成します。

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSDictionary(subscripts)
- (id)objectForKeyedSubscript:(id)key;
@end

@interface NSMutableDictionary(subscripts)
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end

@interface NSArray(subscripts)
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
@end

@interface NSMutableArray(subscripts)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
#endif

このチャンクをgithubに置きました。

注:NSObject以前は、関連するオブジェクトにのみメソッドを追加する方法を説明する前に、必要なメソッドを追加することを提案していました。振り返ってみると、これは私のミスだったと思います。ここで提示されているアプローチとは異なり、コンパイル時ではなく実行時にエラーがキャッチされるようになりました。そのアプローチはまだ私のブログにありますが、今では便利なアプローチというよりはクールなハックだと思います。

ソース:

于 2012-07-25T22:52:00.360 に答える