2015年

6月

12日

Objective-C コレクション 配列(NSArray、NSDictionary)追加、置換、挿入、削除

コレクション

Objective-C にはオブジェクトの集合を扱うためのクラスが6つ用意されています。これらのクラスのことをコレクションと呼びます。コレクションを大きく分けると次の3つになります。

NSArray
 Array とは配列のことです。ただし C 言語の配列と違う点は NSArray では型の指定はできません。型としてはオブジェクト型の配列としてのみ扱われます。他の型の配列を使いたい場合はそのまま C 言語の配列を使えば良いということになります。

NSDictionary
 Array (配列) は各要素 (オブジェクト) を Index (添え字) で識別します。添え字とは 0 から始まる続き番号のことです。それに対して Dictionary (辞書) は各要素 (オブジェクト) をキー (名前) で識別します。要素の事を値 (Value) と呼び一組の値とキーのペアをエントリーと呼びます。エントリーはいくつでも登録することができますが NSDicitonary も NSArray と同じく各要素およびキーはオブジェクトでなければなりません。キーには普通 NSString (文字列オブジェクト) が使われます。

NSSet
 Set (集合) は番号やキーによって識別する必要のないオブジェクトの集合を取り扱います。

ViewController.m

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


// 配列[プリミティブボタン]ボタンを押した時

- (IBAction)proc01:(id)sender {

    

    // 配列作成

    int arr[] = {10, 20, 30, 40, 50};

    

    // 配列作成(別記1)

//   int arr[3] = {10, 20, 30};

    

    // 配列作成(別記2)

//   int arr[3];

//   arr[0] = 10;

//   arr[1] = 20;

//   arr[2] = 30;

    

    // 要素数の取得 サイズの計算をして求める 20バイト数 / 4バイト数 配列の数:5

    int cnt = sizeof(arr) / sizeof(arr[0]);

    

    NSLog(@"arr:%ld", sizeof(arr));

    NSLog(@"arr:%ld", sizeof(arr[0]));

    

    // 値を取得

    for (int i = 0; i < cnt; i++) {

        NSLog(@"%d", arr[i]);

    }

}


// 配列[クラス]ボタンを押した時

- (IBAction)proc02:(id)sender {

    

    NSString *arr[] = {@"あいうえお", @"かきくけこ"};

    

    // 要素数の取得 サイズの計算をして求める ポインター変数のサイズ

    int cnt = sizeof(arr) / sizeof(arr[0]);

    

    // 値を取得

    for (int i = 0; i < cnt; i++) {

        NSLog(@"%@", arr[i]);

    }

}


//コレクションクラス(NSArray)[Normal]ボタンを押した時

- (IBAction)proc03:(id)sender {

    

    // オブジェクト生成

//  NSArray *arr = [NSArray arrayWithObjects:

//                     @"1st", @"2nd",@"3rd", nil];

    

    // 近代的な書き方

    NSArray *arr = @[@"1stだだ", @"2nd",@"3rd"];

    

//  // 要素数の取得 メソッド形式 int 32ビット型

//  int cnt = [arr count];

    

    // 要素数の取得 メソッド形式 64ビット型 32ビット型 両方OK

    NSUInteger cnt = [arr count];


    // 値の取得 int 32ビット型

//  for (int i = 0; i < cnt; i++) {

//       NSString *val = [arr objectAtIndex:i];

//       NSLog(@"%@", val);

//   }

    

    // 値の取得 NSUInteger 64ビット型 32ビット型 両方OK

    // (個別取得)

    for (NSUInteger i = 0; i < cnt; i++) {

        

//      NSString *val = [arr objectAtIndex:i];

        NSString *val = arr[i];

        NSLog(@"個別取得:%@", val);

    }

    

    // 値の取得(簡易取得)

    NSLog(@"簡易取得:%@", arr);

    

    // 値の取得(高速列挙取得)

    // データの最後まで読み込む

    for (NSString *val in arr) {

        

        NSLog(@"高速列挙取得:%@", val);

    }

    

}


//コレクションクラス(NSArray)[Mutable]ボタンを押した時

- (IBAction)proc04:(id)sender {

    

    // オブジェクト生成

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:

                           @"1st", @"2nd",@"3rd" , nil];

    

    NSLog(@"Mutable取得:%@", arr);

    

    // 要素の追加

    [arr addObject:@"4th"];

    NSLog(@"追加:%@", arr);

    

    // 要素の置換

    [arr replaceObjectAtIndex:1

                   withObject:@"2nd2nd"];

    NSLog(@"置換:%@", arr);

    

    // 要素の挿入

    [arr insertObject:@"2nd" atIndex:1];

    NSLog(@"挿入:%@", arr);

    

    // 要素の削除

    [arr removeObjectAtIndex:2];

    NSLog(@"削除:%@", arr);

    

    // 要素の全削除

    [arr removeAllObjects];

    NSLog(@"全削除:%@", arr);


}


// コレクションクラス(NSDictionary)ボタンを押した時

- (IBAction)proc05:(id)sender {

    

    // オブジェクト生成

//  NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:

//                         @"1st", @"key01",

//                         @"2nd", @"key02",

//                         @"3rd", @"key03",

//                         nil];

    

    NSDictionary *dic = @{

                          @"key01": @"1st",

                          @"key02": @"2nd",

                          @"key03": @"3rd",

                          };

    

    // 要素数の取得(個別取得)

    NSUInteger cnt = [dic count];

    

    // 値の取得

    for (NSInteger i; i < cnt; i++) {

        

        NSString *key = [[dic allKeys] objectAtIndex:i];

        NSString *val = [[dic allValues] objectAtIndex:i];

        NSLog(@"個別取得:%@,%@", key, val);

        

    }

    

    // 要素数の取得(キー指定取得)

    // {}for文と同じでローカル記述になる。

    {

//      NSString *val = [dic objectForKey:@"key02"];

        NSString *val = dic[@"key02"];

        NSLog(@"キー指定取得:%@", val);

    }

    

    // 要素数の取得(簡易取得)

    NSLog(@"簡易取得:%@", dic);

    

    // 要素数の取得(高速列挙取得)

    // データの最後まで読み込む

    for (NSString *key in dic) {

        NSLog(@"高速列挙取得:%@, %@", key, dic[key]);

    }

}


// コレクションクラス(NSDictionary)ボタンを押した時

- (IBAction)proc06:(id)sender {

    

    // オブジェクト生成

    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                @"1st", @"key01",

                                @"2nd", @"key02",

                                @"3rd", @"key03",

                                nil];

    NSLog(@"生成:%@", dic);

    

    // 要素の追加、置換

    [dic setObject:@"4th" forKey:@"key04"];

    [dic setObject:@"2nd2nd" forKey:@"key02"];

    NSLog(@"追加、置換:%@", dic);

    

    // 要素の挿入

    // なし (挿入の順番は保持されないから)こことここの間の挿入はありません。

    // キーの値がユニークで順番は関係なし

    

    // 要素の削除

    [dic removeObjectForKey:@"key02"];

    NSLog(@"削除:%@", dic);

    

    // 要素の全削除

    [dic removeAllObjects];

    NSLog(@"全削除:%@", dic);

    

}


// コレクションクラス応用(ラッパー)ボタンを押した時

- (IBAction)proc07:(id)sender {

    

    // NSNumberでラッピングする事により

    // プリミティブ

    // オブジェクトとして扱える

//  NSNumber *num01 = [NSNumber numberWithInt:10];

    NSNumber *num01 = @10;

    NSNumber *num02 = @20;

    

    NSArray *arr = @[num01, num02];

    NSLog(@"%@", arr);

    

    int val01 = [arr[0] integerValue];

    NSLog(@"%d", val01);

    

}


@end

GitHub Collection

  

目 次