iOSで新しいObjective-Cオブジェクトリテラルを有効にする方法は?

ダリン

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Objective-Cで有効なオブジェクトを確認する方法は?

分類Dev

オブジェクトリテラルでgetElementByIDを複数回使用する効率的な方法は?

分類Dev

オブジェクトが有効なのに、SQL Serverテーブルの無効なオブジェクト名を取得するのはなぜですか?

分類Dev

古い共有オブジェクト(so)が新しい共有オブジェクト(so)にリンクされている場合に、「利用可能なバージョン情報がない」を解決する効率的な方法は何ですか?

分類Dev

オブジェクトリテラルでジェネリック型を特殊化する方法は?

分類Dev

Phaser.jsでグラフィックオブジェクトの物理を有効にする方法は?

分類Dev

JFRでオブジェクト統計を有効にする方法は?

分類Dev

JavaScriptオブジェクトリテラルを 'eval'なしでJavaScriptオブジェクトに変換する

分類Dev

Javascriptオブジェクトリテラルを多くの静的キー/値ペアで効率的に埋めるにはどうすればよいですか?

分類Dev

他のプロパティに基づいてオブジェクトリテラルでオブジェクトプロパティを計算する方法

分類Dev

Linux共有オブジェクト(ライブラリ)を単独で実行可能にする方法は?

分類Dev

lodashを使用して、オブジェクトリテラル内の別の値に基づいてオブジェクトの値を更新する方法

分類Dev

C#でジェネリック制約の有効な型オブジェクトを取得するにはどうすればよいですか?

分類Dev

オブジェクトを編集して新しいオブジェクトを配列に渡す方法は?ReactJS、マテリアルUI

分類Dev

文字列形式のオブジェクトリテラルからオブジェクトを作成するにはどうすればよいですか?

分類Dev

htmlテーブルでクリック可能な新しい追加行を有効にする方法は?

分類Dev

3D オブジェクトを前にリアルワールド オブジェクトでマスクする方法は? (タンゴ、ユニティ)

分類Dev

オブジェクトを互いに接続するクリーンで効率的な方法は何ですか

分類Dev

JavaScriptオブジェクトリテラルで変数キーを使用する方法はありますか?

分類Dev

オブジェクトリテラルでaddEventListenerを使用する

分類Dev

オブジェクトリテラルで `this`を使用する

分類Dev

プロパティに基づいてC#リストオブジェクトを条件付きでシリアル化する方法はありますか?

分類Dev

AngularJS でオブジェクト リテラルを localStorage に保存する

分類Dev

Androidのレルム移行で新しいクラスに既存のオブジェクトを追加する方法

分類Dev

反応ネイティブでオブジェクトをシリアル化されたオブジェクトに変換する方法は?

分類Dev

リスト(テーブルではない)を出力するオブジェクトを作成する方法

分類Dev

共有オブジェクトファイルを他の共有オブジェクトまたは通常のオブジェクトとリンクして、新しいオブジェクトファイルを作成するにはどうすればよいですか?

分類Dev

nodejsがオブジェクトキー文字列をオブジェクトリテラルに変換するのはなぜですか?

分類Dev

文字列をリテラルオブジェクト配列に変換することは可能ですか?

Related 関連記事

  1. 1

    Objective-Cで有効なオブジェクトを確認する方法は?

  2. 2

    オブジェクトリテラルでgetElementByIDを複数回使用する効率的な方法は?

  3. 3

    オブジェクトが有効なのに、SQL Serverテーブルの無効なオブジェクト名を取得するのはなぜですか?

  4. 4

    古い共有オブジェクト(so)が新しい共有オブジェクト(so)にリンクされている場合に、「利用可能なバージョン情報がない」を解決する効率的な方法は何ですか?

  5. 5

    オブジェクトリテラルでジェネリック型を特殊化する方法は?

  6. 6

    Phaser.jsでグラフィックオブジェクトの物理を有効にする方法は?

  7. 7

    JFRでオブジェクト統計を有効にする方法は?

  8. 8

    JavaScriptオブジェクトリテラルを 'eval'なしでJavaScriptオブジェクトに変換する

  9. 9

    Javascriptオブジェクトリテラルを多くの静的キー/値ペアで効率的に埋めるにはどうすればよいですか?

  10. 10

    他のプロパティに基づいてオブジェクトリテラルでオブジェクトプロパティを計算する方法

  11. 11

    Linux共有オブジェクト(ライブラリ)を単独で実行可能にする方法は?

  12. 12

    lodashを使用して、オブジェクトリテラル内の別の値に基づいてオブジェクトの値を更新する方法

  13. 13

    C#でジェネリック制約の有効な型オブジェクトを取得するにはどうすればよいですか?

  14. 14

    オブジェクトを編集して新しいオブジェクトを配列に渡す方法は?ReactJS、マテリアルUI

  15. 15

    文字列形式のオブジェクトリテラルからオブジェクトを作成するにはどうすればよいですか?

  16. 16

    htmlテーブルでクリック可能な新しい追加行を有効にする方法は?

  17. 17

    3D オブジェクトを前にリアルワールド オブジェクトでマスクする方法は? (タンゴ、ユニティ)

  18. 18

    オブジェクトを互いに接続するクリーンで効率的な方法は何ですか

  19. 19

    JavaScriptオブジェクトリテラルで変数キーを使用する方法はありますか?

  20. 20

    オブジェクトリテラルでaddEventListenerを使用する

  21. 21

    オブジェクトリテラルで `this`を使用する

  22. 22

    プロパティに基づいてC#リストオブジェクトを条件付きでシリアル化する方法はありますか?

  23. 23

    AngularJS でオブジェクト リテラルを localStorage に保存する

  24. 24

    Androidのレルム移行で新しいクラスに既存のオブジェクトを追加する方法

  25. 25

    反応ネイティブでオブジェクトをシリアル化されたオブジェクトに変換する方法は?

  26. 26

    リスト(テーブルではない)を出力するオブジェクトを作成する方法

  27. 27

    共有オブジェクトファイルを他の共有オブジェクトまたは通常のオブジェクトとリンクして、新しいオブジェクトファイルを作成するにはどうすればよいですか?

  28. 28

    nodejsがオブジェクトキー文字列をオブジェクトリテラルに変換するのはなぜですか?

  29. 29

    文字列をリテラルオブジェクト配列に変換することは可能ですか?

ホットタグ

アーカイブ