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)プロジェクトと同じように、コンパイルに失敗します。
これは、古いプロジェクトと新しいプロジェクトとは関係ありませんが、使用するSDKの要素です。発生している問題は、これはコンパイラ機能ですが、SDKサポートが必要なことです。iOS 5 SDKはそのサポートを提供しませんが、iOS 6SDKはサポートを提供します。
そのため、iOS 6SDKを使用する必要があります。iOS 5 SDKでオブジェクトの添え字を使用する場合は、このまま読み進めてください。
コンパイラが呼び出しを試行できるように、ヘッダーファイルを追加するだけです。実装を追加する必要はありません。によって自動的に処理されarclite
ます。(ARCを使用していない場合は、リンカーに強制的に含めるarclite
必要があります。ただし、実際にARCに切り替える必要はありません。)
新しいインターフェイスファイル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
関連するオブジェクトにのみ追加する方法を説明する前に、必要なメソッドをに追加することを提案していました。振り返ってみると、これは私の側の誤りだったと思います。ここで紹介するアプローチとは異なり、コンパイル時ではなく実行時にエラーが検出されることになりました。そのアプローチはまだ私のブログにありますが、今では便利なアプローチというよりはクールなハックだと思います。
ソース:
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加