いまさらですがXcode4.4からiOS開発で使えるようになった新しいObjective-Cの書き方をまとめます

2012年8月12日
ios / objc / xcode /

もうほとんどのかたが既知の内容と思いますが、まとめさせていただきます。
これらは全てコンパイル時に事が済む類のものなので、iOS5だけでなくiOS4でも当然使えるというのが嬉しいですね!

Xcode4.4適用前

Xcode4.3までのこのコードを…

#pragma mark - Private Category

@interface Sample ()

@property (strong) NSNumber* i;
@property (strong) NSNumber* c;
@property (strong) NSNumber* f;
@property (strong) NSArray* array;
@property (strong) NSDictionary* dictionary;

- (void)privateMethods1;
- (void)privateMethods2;
- (void)privateMethods3;

@end 

#pragma mark - Main Implementation

@implementation Sample

@synthesize i = i_;
@synthesize c = c_;
@synthesize f = f_;
@synthesize array = array_;
@synthesize dictionary = dictionary_;

- (void)privateMethods1
{
  [self privateMethods2];
  [self privateMethods3];
}

- (void)privateMethods2
{
  self.i = [NSNumber numberWithInt:100];
  self.c = [NSNumber numberWithChar:'a'];
  self.f = [NSNumber numberWithFloat:3.14f];
}

- (void)privateMethods3
{
  self.array = [NSArray arrayWithObjects:@"1", @"2", [NSNumber numberWithBool:YES], nil];
  self.dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"val1", @"key1", @"val2", @"key2", nil];
}

@end

Xcode4.4適用後

Xcode4.4からはこうできます!

#pragma mark - Private Category

@interface Sample ()

@property (strong) NSNumber* i;
@property (strong) NSNumber* c;
@property (strong) NSNumber* f;
@property (strong) NSArray* array;
@property (strong) NSDictionary* dictionary;

@end 

#pragma mark - Main Implementation

@implementation Sample

- (void)privateMethods1
{
  [self privateMethods2];
  [self privateMethods3];
}

- (void)privateMethods2
{
  self.i = @100;
  self.c = @'a';
  self.f = @3.14f;
}

- (void)privateMethods3
{
  self.array = @[@"1", @"2", @(YES)];
  self.dictionary = @{@"key1": @"val1", @"key2": @"val2"};
}

@end

以下、具体的な内容を説明します。

@synthesizeを省略できます

-@synthesize i = i_;
-@synthesize c = c_;
-@synthesize f = f_;
-@synthesize array = array_;
-@synthesize dictionary = dictionary_;

これまでは、@propertyを定義した場合には、@synthesizeで自動でgetter/setterを付加するか、@dynamicで自分で実装するかのどちらかが必須でした。

Xcode4.4からは @synthesizeも@dynamicも書かなかった場合には@synthesizeを付けたのと同じ扱いとなる ようになりました。

NSNumber, NSArray, NSDictionary も短いコードで作れます

 - (void)privateMethods2
 {
-  self.i = [NSNumber numberWithInt:100];
-  self.c = [NSNumber numberWithChar:'a'];
-  self.f = [NSNumber numberWithFloat:3.14f];
+  self.i = @100;
+  self.c = @'a';
+  self.f = @3.14f;
 }
 
 - (void)privateMethods3
 {
-  self.array = [NSArray arrayWithObjects:@"1", @"2", [NSNumber numberWithBool:YES], nil];
-  self.dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"val1", @"key1", @"val2", @"key2", nil];
+  self.array = @[@"1", @"2", @(YES)];
+  self.dictionary = @{@"key1": @"val1", @"key2": @"val2"};
 }

NSStringについては @“hoge”@ を文字列の前に付けることでNSStringのインスタンスを作れるというのが周知の事実です。
Xcode4.4ではさらに、

についても同様の省略形の書き方が追加されました。
具体的には、それぞれ

といった書き方ができるようになります。

ずいぶん楽になりますね!
この他、@(1 + 2 + 3) といったかんじで括弧内の演算結果でNSNumberのインスタンスを作ることもできます。

上記のとおり、Xcode4.4からは NSNumber, NSArray, NSDictionaryでも @ を使った省略形が使える ようになりました。

privateメソッドの定義を省略できます

-- (void)privateMethods1;
-- (void)privateMethods2;
-- (void)privateMethods3;

これまではprivateメソッドについては無名カテゴリで宣言しておく必要がありました(正確にはそのメソッドを利用するコードの前に宣言しておく必要がありました)。

Xcode4.4からは あらかじめ宣言されていないメソッドでも同じコード内に実装されていれば使える ようになりました。

※ なお、このメソッドの宣言の省略はXcode4.3+LLVMでもできるということを、@ClimbAppDevさんからご指摘いただきました。ありがとうございます!

次の記事 では、[]でNSArrayやNSDictionaryや独自クラスにアクセスできる件について書きます。

Related Entries
Latest Entries