[iOSアプリ開発] いまさら聞けないモダンな書き方

[iOSアプリ開発] いまさら聞けないモダンな書き方

Clock Icon2013.05.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Xcode 4.4 から Objective-C が書きやすくなりました、という今更のいまさらな話ですが、ネット上に転がっている少し前のサンプルソースなどは古い書き方のものもあるようなので、今回はよく使う NSArrayNSDictionaryNSNumber の書き方についてだけ備忘録として残しておこうと思います。

NSArray

インスタンスの生成

    // 古い書き方
    NSArray *oldArr = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
    NSMutableArray *oldMutableArr = [NSMutableArray arrayWithObjects:@"value4", @"value5", @"value6", nil];
    
    // 新しい書き方
    NSArray *newArr = @[@"value1", @"value2", @"value3"];
    NSMutableArray *newMutableArr = [@[@"value4", @"value5", @"value6"] mutableCopy];

@[ ]NSArray を生成できます。
NSMutableArray について、古い書き方の L3 が、そのまま新しい書き方の L7 になるわけではないですが、
NSArray を簡単な書き方で生成してから mutableCopyNSMutableArray を生成した方が書きやすいです。

要素の取得

    // 古い書き方
    NSString *oldItem = [oldArr objectAtIndex:0];
    
    // 新しい書き方
    NSString *newItem = newArr[0];

添字 [n] で要素を取得できます。NSArrayNSMutableArray の両方で使えます。

要素の置き換え

    // 古い書き方
    [oldMutableArr replaceObjectAtIndex:0 withObject:@"value7"];
    
    // 新しい書き方
    newMutableArr[0] = @"value7";

添字 [n] で要素を置き換えることができます。
NSMutableArray で使えます。NSArray では要素を置き換えることができないので使えません。

NSDictionary

インスタンスの生成

    // 古い書き方
    NSDictionary *oldDic = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"value1", @"key1",
                            @"value2", @"key2",
                            @"value3", @"key3",
                            nil];
                            
    NSMutableDictionary *oldMutableDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                          @"value4", @"key4",
                                          @"value5", @"key5",
                                          @"value6", @"key6",
                                          nil];
    
    // 新しい書き方
    NSDictionary *newDic = @{@"key1":@"value1",
                             @"key2":@"value2",
                             @"key3":@"value3"};
                             
    NSMutableDictionary *newMutableDic = [@{@"key4":@"value4",
                                          @"key5":@"value5",
                                          @"key6":@"value6"}
                                          mutableCopy];

@{ }NSDictionary を生成できます。
NSMutableDictionary について、古い書き方の L8 〜 L12 が、そのまま新しい書き方の L19 〜 L22 になるわけではないですが、
NSDictionary を簡単な書き方で生成してから mutableCopyNSMutableDictionary を生成した方が書きやすいです。

要素の取得

    // 古い書き方
    NSString *oldKey1Item = [oldDic objectForKey:@"key1"];
    
    // 新しい書き方
    NSString *newKey1Item = newDic[@"key1"];

添字 [キー値] で要素を取得できます。NSDictionaryNSMutableDictionary の両方で使えます。

要素の置き換え、追加

    // 古い書き方
    [oldMutableDic setObject:@"updateValue1" forKey:@"key1"];
    
    // 新しい書き方
    newMutableDic[@"key1"] = @"updateValue1";

添字 [キー値] で要素の置き換え、追加ができます。
NSMutableDictionary で使えます。NSDictionary では要素を置き換えることができないので使えません。

NSNumber

    // 古い書き方
    NSNumber *oldInt = [NSNumber numberWithInt:12];
    NSNumber *oldUnsignedInt = [NSNumber numberWithUnsignedInt:34U];
    
    NSNumber *oldLong = [NSNumber numberWithLong:56L];
    NSNumber *oldLongLong = [NSNumber numberWithLongLong:78LL];
    
    NSNumber *oldFloat = [NSNumber numberWithFloat:12.34f];
    NSNumber *oldDouble = [NSNumber numberWithDouble:56.78];
    
    NSNumber *oldYes = [NSNumber numberWithBool:YES];
    NSNumber *oldNo = [NSNumber numberWithBool:NO];
    
    NSNumber *oldNum = [NSNumber numberWithDouble:M_PI / 2.0];
    
    // 新しい書き方
    NSNumber *newInt = @12;
    NSNumber *newUnsignedInt = @34U;
    
    NSNumber *newLong = @56L;
    NSNumber *newLongLong = @78LL;
    
    NSNumber *newFloat = @12.34f;
    NSNumber *newDouble = @56.78;
    
    NSNumber *newYes = @YES;
    NSNumber *newNo = @NO;
    
    NSNumber *newNum = @(M_PI / 2.0);

それぞれ numberWith... を使わずに書くことができます。

一括変換

ついでに、Xcode には簡単に一括変換してくれる機能が搭載されています。

ios-modern-nsarray

「Edit」「Refactor」「Convert to Modern Objective-C Syntax...」 から変換することができます。
これだけでも読みやすくなるので、非常に便利です。

ではでは。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.