[解決済み] Xcode 4.4のリリースノートに記載されている "Objective-C Literals "の詳細は?
質問事項
Xcode 4.4のリリースノートを読んでいて、こんなことに気がつきました。
LLVM 4.0コンパイラ
Xcode には Apple LLVM Compiler version 4.0 が含まれ、以下の新しい Objective-C 言語機能が含まれています。 [...]
- Objective-C リテラル: NSString のリテラルと同様に、NSArray、NSDictionary、および NSNumber のリテラルを作成します。
この機能には興味をそそられますね。のリテラルをどのように使用するのか、私にはまったくわかりません。
NSString
はどのように機能し、どのように
NSArray
,
NSDictionary
および
NSNumber
.
詳細は?
解決方法は?
からそのままコピーしたものです。 http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :
Objective-Cのリテラルです。 NSArray、NSDictionary、および NSNumber のリテラルを作成できるようになりました (NSString のリテラルを作成できるのと同じように)。
NSArray リテラル
以前は
array = [NSArray arrayWithObjects:a, b, c, nil];
今すぐ
array = @[ a, b, c ];
NSDictionary リテラル
以前は
dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
forKeys:@[k1, k2, k3]];
今すぐ
dict = @{ k1 : o1, k2 : o2, k3 : o3 };
NSNumber リテラル
以前は
NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];
今すぐ
NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
[編集]をクリックします。
zxoq で http://news.ycombinator.com/item?id=3672744 は、さらに興味深い新しい添え字を追加しました。(リテラルで追加)。
arr[1] === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]
[編集2]
新しいObjCリテラルについては、複数の WWDC 2012 セッションを開催しました。各スライドのファイル名と時間は意図的に削除していませんので、気が向いたらご自身で探してみてください。基本的にはこの投稿に記載されているものと同じですが、いくつか新しいものもありますので、画像の上に記載しておきます。
画像はすべて大きいのでご注意ください。別のタブにドラッグすると元の大きさで見ることができます。
[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]
<イグ
@42
@10.8
@YES
@(6 + x * 2012)
[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]
<イグ
@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]
この部分は新しいものです。 式辞
式がある場合 (
M_PI / 16
のように、括弧で囲んでください。
この構文は、数式、ブーリアン、(C-)文字列のインデックス検索、ブーリアン値、列挙型定数、そして文字列にも有効です!
NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)];
NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]];
NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]];
NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight];
NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")];
<イグ
NSNumber *piOverSixteen = @( M_PI / 16 );
NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );
NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );
NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );
NSNumber *path = @( getenv("PATH") );
文字列の詳細と、このリテラル構文をどのような場合に使用できるかを説明します。
NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
// search for a file in dir...
}
<イグ
NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
// search for a file in dir...
}
配列リテラルのしくみ
// when you write this:
array = @[a, b, c ];
// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects) / sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];
辞書リテラルのしくみ
// when you write this:
dict = @{k1 : o1, k2 : o2, k3 : o3 };
// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects
forKeys:keys
count:count];
配列の添え字の詳細
@implementation SongList {
NSMutableArray *_songs;
}
- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
Song *oldSong = [_songs objectAtIndex:idx];
[_songs replaceObjectAtindex:idx withObject:newSong];
return oldSong;
}
<イグ
@implementation SongList {
NSMutableArray *_songs;
}
- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
Song *oldSong = _songs[idx];
_songs[idx] = newSong;
return oldSong;
}
辞書の添え字の詳細
@implementation Database {
NSMutableDictionary *_storage;
}
- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
id oldObject = [_storage objectForKey:key];
[_storage setObject:object forKey:key];
return oldObject;
}
<イグ
@implementation Database {
NSMutableDictionary *_storage;
}
- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
id oldObject = _storage[key];
_storage[key] = newObject;
return oldObject;
}
[編集3]
マイク・アッシュ は、この新しいリテラルについて素晴らしい記事を書いています。もっと詳しく知りたい場合は チェックアウト .
関連
-
[解決済み] Objective-Cでオブジェクトをキャストする方法
-
[解決済み] デバイス用にコンパイルするとApple Mach-Oのリンカーエラーが発生する。
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] synthesize vs @dynamic、その違いとは?
-
[解決済み] Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?
-
[解決済み】Xcodeのコマンドラインからの "Build and Archive "について
-
[解決済み】NSArrayをアルファベット順に並べるには?
-
[解決済み】iOS 7.0とシステム劣化で無効なコンテキスト0x0が表示される
-
[解決済み】Objective-Cでオブジェクトがどのクラスであるかをテストするにはどうすればよいですか?
-
[解決済み] 一部のファイルに対する自動参照カウントの無効化
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] どのような場合に@synthesizeを明示的に使用する必要がありますか?
-
[解決済み] クラス 'test_coredataAppDelegate' の重複したインターフェイス宣言
-
[解決済み] iPhoneでObjective-Cはガベージコレクタを搭載しているのか?
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] Objective-Cで、オブジェクトの種類をテストするにはどうしたらいいですか?
-
[解決済み】iOS7でステータスバーを隠すことができない。
-
[解決済み】idの代わりにinstancetypeを使い始めるのは有益でしょうか?
-
[解決済み】iOSでメールアドレスが有効であることを確認する【重複あり