XCode4.4 のコーディング

2012/07/26

今日からライオンでも使える!XCODE4.4 MODERN OBJECTIVE-C SYNTAXでコードをきれいにする方法」を参考に、早速試してみました。 ---2012/09/06追記 参考:Objective-C Literals

@synthesize の省略

@property で宣言した変数は、自動的に @synthesizeをコード補完してくれます。

@property (nonatomic) NSString *name;
@property (nonatomic) float time;

... @synthesize がいらない ...

- (void)bind {
   _name = @"Mike";
   _time = 10.0f;
}

これは省略もそうですが、コードの統一感という点で非常に大きな意味があると思います。 今までだと、アンダースコアをつけなかったり適当にコーディングできましたから。

NSArray, NSMutableArrayの記述

NSArray は @[...] で、NSMutableArray は [@[...], mutableCopy] で記述

@property (nonatomic) NSString *name;
@property (nonatomic) float time;

- (void)bind {
    NSArray *values1 = @[
                       @"1_setting01.png",
                       @"1_setting02.png",
                       @"1_setting03.png",
                       @"1_setting04.png",
    ];
    NSMutableArray *values2 = [@[
                       @"1_setting01.png",
                       @"1_setting02.png",
                       @"1_setting03.png",
                       @"1_setting04.png",
                       ]
                       mutableCopy];
}

---2012/09/06追記 Object Subscripting ってのが追加されているようです。 今まで、NSArray や NSDictionary ではのキーによるデータ取得はC言語のような(?)記述では取得できませんでしたが、これもできるようになりました。

  int cArray[] = { 100, 200, 300 };
   NSArray *nsArray = @[ @100, @200, @300 ];

   cArray[1]; // 200
   nsArray[1]; // @200

    NSMutableArray *nsArray = [@[ @100, @200, @300 ] mutableCopy];
    nsarray[1] = @33;

これは、かなり嬉しい構文ではないでしょうか?

リテラル値の記述

int,float を NSNumber に変換とか、リテラル値の変換を省略できるようになりました。

- (void)update:(int)score :(float)time {
    NSMutableDictionary *value = [NSMutableDictionary dictionary];
    [value setValue:@(score) forKey:@"score"];
    [value setValue:@(time) forKey:@"time"];
}

NSDictionary, NSMutableDictionary の記述

さらに、NSMutableDictionary を省略すると

- (void)update:(int)score :(float)time {
    NSMutableDictionary *test = [@{@"score":@(score), @"time":@(time)} mutableCopy];
}