2012年3月16日金曜日

最新 clang で @YESや dict[@"key"] が可能に

Objective-Cのリテラル強化きた。
NSArray *array =
[NSArray arrayWithObjects: @0, @23, @3.1415, @YES, nil];
int値、float値や BOOL値 に @ を付けると NSNumberに変更される。




以下、上記サイトからの紹介。
※今回の新しいリテラル表記は clang trunk(clangの最新コード)の話で現在の Xcodeではまだ使えない。


NSArrayの初期化で @[]表記が使える。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];


NSArray配列に []でアクセスが。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];

NSLog (@"gronk 0: %@", gronk[0]);
NSLog (@"gronk 2: %@", gronk[2]);

入れ子
NSArray *nesting = @[ @"hi", @[ @"ohai" ] ];
NSLog (@"nesting: %@", nesting[1][0]);

-> nesting: ohai

NSMutableArrayなら代入も可能
mutt[0] = @"aaa";
mutt[3] = @"d";
mutt[4] = @"e";
さらにインデックスが範囲外の場合、自動的にインサート(insertObject:index:)される。


次に NSDictionary の初期化。"キー:値" 表記が可能に。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };
NSLog (@"splunge %@", splunge);

->splunge {
greeble = bork;
hi = bork;
}

今までのを組み合わせるとこれが
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSFont userFontOfSize: 150.0],  NSFontAttributeName,
        [NSNumber numberWithFloat: 3.0], NSStrokeWidthAttributeName,
        [NSColor blueColor],             NSStrokeColorAttributeName,
        [NSNumber numberWithInt: 10],    NSKernAttributeName,
        [NSNumber numberWithFloat: 0.5], NSObliquenessAttributeName,
        nil];
こうなる
NSDictionary *attributes = @{
        NSFontAttributeName        : [NSFont userFontOfSize: 150.0],
        NSStrokeWidthAttributeName : @3.0,
        NSStrokeColorAttributeName : [NSColor blueColor],
        NSKernAttributeName        : @10,
        NSObliquenessAttributeName : @0.5
    };
すっきりしてわかりやすい。


NSDictionaryへのアクセスは [@キー]が使える。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };

NSLog (@"%@", splunge[@"greeble"]);
NSLog (@"%@", splunge[@"ACK"]);

入れ子
NSDictionary *nest = @{ @"hi" : @"ohai",
@"ichc" : @{ @"oop" : @"ack"} };
NSLog (@"nest: %@", nest);
NSLog (@"noost: %@", nest[@"ichc"][@"oop"]);
NSLog (@"nist: %@", nest[@"ichc.oop"]); // try a key path


なお staticな宣言では利用できない。例えば下記はNG
#import

NSString *thing = @"thing 1";
NSArray *array = @[ @"thing 2" ];

@implementation BNRGroovyObject
...

- - - -
大幅なリテラル表記の新規追加はいまさら感もあるがコーディングが楽になるし可読性が増すので歓迎したい。しかし ARC導入といい、数年前の Objective-C コードとの断絶が出てきた。いっそのこと ARCと新リテラル表記で Objective-C 3.0 にした方が良かったと思うくらい。


0 件のコメント:

コメントを投稿