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

Appleのサンプルコードで発見したNSDictionaryと自作オブジェクトの相互変換のやり方です。

* NSDictionaryのデータを自作オブジェクトに変換するのが 
__- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;__

* 自作オブジェクトのデータをNSDictionaryに変換するのが
__- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;__

#サンプル

```objc: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;

- (NSArray *)personKeys;

@end

```
```objc:Person.m

#import "Person.h"

@implementation Person

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

@end

```

```objc:ViewController

#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番目", i);
        NSLog(@"firstName:%@", person.firstName);
        NSLog(@"lastName:%@", person.lastName);
        NSLog(@"bloodType:%@", person.bloodType);
        NSLog(@"age:%@", person.age);
        
        NSDictionary *personDict = [person dictionaryWithValuesForKeys:[person personKeys]];
        NSLog(@"personDict:%@", personDict);
        i++;
    }

}

@end
```

#出力ログ
__1番目__
__firstName:Muneo__
__lastName:Suzuki__
__bloodType:B__
__age:65__
__personDict:{__
__age = 65;__
__bloodType = B;__
__firstName = Muneo;__
__lastName = Suzuki;__
__}__

__2番目__
__firstName:Ichiro__
__lastName:Suzuki__
__bloodType:B__
__age:39__
__personDict:{__
__age = 39;__
__bloodType = B;__
__firstName = Ichiro;__
__lastName = Suzuki;__
__}__

__3番目__
__firstName:An__
__lastName:Suzuki__
__bloodType:B__
__age:26__
__personDict:{__
__age = 26;__
__bloodType = B;__
__firstName = An;__
__lastName = Suzuki;__
__}__

#まとめ
* NSDictionaryのデータを自作オブジェクトに変換する場合はNSDictionaryのkeyと同じ名前のプロパティを自作オブジェクトで定義してあげること。

* 自作オブジェクトからNSDictionaryに変換する場合はkeyとなる文字列を配列で返すメソッドを自作オブジェクトに定義すること。

特にJSONデータを処理する際に重宝しそうですね。