4

オンラインでハウツーをたどる過程で、次のコードに出くわしました。

NSDictionary *address = @{
  (NSString *)kABPersonAddressStreetKey: _address.text,
  (NSString *)kABPersonAddressCityKey: _city.text,
  (NSString *)kABPersonAddressStateKey: _state.text,
  (NSString *)kABPersonAddressZIPKey: _zip.text
};

XCode 4.5.1 ではコンパイルされません。2 つのエラーが表示されます。

  1. プログラム内のストレイ '@'
  2. 「:」トークンの前に「}」が必要です

ここで何が欠けていますか?また、この NSDictionary オブジェクトのショートカット宣言に関するドキュメントはどこにありますか? このような Google 構文は非常に困難です。

4

3 に答える 3

5

これは、LLVM 4.0 以降に導入されたObj-C Literalsの一部です。正しいバージョンの iOS を使用していることも確認してください。元の llvm 4.0 より前の言語に翻訳すると、NSDictionary の割り当ては次のようになります。

NSDictionary *address = [[NSDictionary alloc] initWithObjectsAndKeys:
                        (NSString *)kABPersonAddressStreetKey, _address.text, 
                        (NSString *)kABPersonAddressCityKey, _city.text,  
                        (NSString *)kABPersonAddressStateKey, _state.text, 
                        (NSString *)kABPersonAddressZIPKey, _zip.text, 
                        nil];
于 2012-10-10T14:45:48.710 に答える
5

これは現代の客観的 c の一部であり、客観的 c リテラルと呼ばれます。古いコンパイラを使用している可能性があります。最新のコンパイラ (現在は LLVM 4.1) を使用していることを確認してください。

于 2012-10-10T14:36:34.307 に答える
3

@ 宣言は、Objective-C リテラルです。情報へのリンク:

Objective-C リテラル

于 2012-10-10T14:37:04.270 に答える