hachinoBlog

hachinobuのエンジニアライフ

NSDictionaryデータ⇔自作オブジェクトに変換する方法

Appleのサンプルコードで発見したNSDictionaryと自作オブジェクトの相互変換メソッド。
NSDictionaryのデータを自作オブジェクトに変換してくれるのがsetValuesForKeysWithDictionary
自作オブジェクトのデータをNSDictionaryにしてくれるのがdictionaryWithValuesForKeys

使い方

//自作オブジェクト
//Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (strong, nonatomic) NSString *firstName;
@property (strong, nonatomic) NSString *lastName;
@property (strong, nonatomic) NSString *bloodType;
@property (strong, nonatomic) NSNumber *age;

//NSDictionaryのkeyを返す
- (NSArray *)personKeys;

@end
//  Person.m

#import "Person.h"

@implementation Person

- (NSArray *)personKeys
{
    return @[@"firstName", @"lastName", @"bloodType", @"age"];
}

@end
//  ViewController.m

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@property (strong, nonatomic) NSArray *personData;

@end

@implementation ViewController

- (NSArray *)personData
{
    
    NSMutableArray *persons = [NSMutableArray array];
    NSDictionary *person1 = @{@"firstName": @"Muneo",
                       @"lastName": @"Suzuki",
                       @"bloodType": @"B",
                       @"age": @65};
    
    NSDictionary *person2 = @{@"firstName": @"Ichiro",
                              @"lastName": @"Suzuki",
                              @"bloodType": @"B",
                              @"age": @39};
    
    NSDictionary *person3 = @{@"firstName": @"An",
                              @"lastName": @"Suzuki",
                              @"bloodType": @"B",
                              @"age": @26};
    
    [persons addObject:person1];
    [persons addObject:person2];
    [persons addObject:person3];
    
    return [persons copy];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    Person *person = [[Person alloc] init];
    NSUInteger i = 1;
    for (NSDictionary *personDic in self.personData) {
        [person setValuesForKeysWithDictionary:personDic];

        NSLog(@"%d person.firstName:%@", i, person.firstName);
        NSLog(@"%d person.lastName:%@", i, person.lastName);
        NSLog(@"%d person.bloodType:%@", i, person.bloodType);
        NSLog(@"%d person.age:%@", i, person.age);
        
        NSDictionary *personDic = [person dictionaryWithValuesForKeys:[person personKeys]];
        NSLog(@"%d dic:%@", i, personDic);
        i++;
    }

}

出力ログ
1番目
firstName:Muneo
lastName:Suzuki
bloodType:B
age:65
personDic:{
age = 65;
bloodType = B;
firstName = Muneo;
lastName = Suzuki;
}

2番目
firstName:Ichiro
lastName:Suzuki
bloodType:B
age:39
personDic:{
age = 39;
bloodType = B;
firstName = Ichiro;
lastName = Suzuki;
}

3番目
firstName:An
lastName:Suzuki
bloodType:B
age:26
personDic:{
age = 26;
bloodType = B;
firstName = An;
lastName = Suzuki;
}

NSDictionaryのデータを自作オブジェクトに変換する場合はNSDictionaryのkeyと同じ名前の変数を定義してあげること。
自作オブジェクトからNSDictionaryに変換する場合はkeyとなる文字列を配列で返すメソッドを自作オブジェクトに定義すること。

JSONデータを処理する際に重宝しそうですね。
今更ながら知りました。