enumと文字列を、enum -> NSString、 NSString -> enumと相互にキャストする汎用な方法を調べたときのメモです。
1. NSArrayのExtensionとしてキャストするメソッドを用意します。
NSArray+EnumExtensions.h
//
// NSArray+EnumExtensions.h
//
#import <Foundation/Foundation.h>
@interface NSArray (EnumExtensions)
/**
* enum to string
* @param value enum value
* @return NSString string value
*/
- (NSString *)stringFromEnum:(NSInteger)value;
/**
* string to enum
* @param value string value
* @return NSInteger enum value
*/
- (NSInteger)enumFromString:(NSString *)value;
/**
* string to enum
* @param value string value
* @param def default enum value
* @return NSInteger enum value
*/
- (NSInteger)enumFromString:(NSString *)value def:(NSInteger)def;
@end
NSArray+EnumExtensions.m
//
// NSArray+EnumExtensions.m
//
#import "NSArray+EnumExtensions.h"
#import <Foundation/Foundation.h>
@implementation NSArray (EnumExtensions)
- (NSString *)stringFromEnum:(NSInteger)value {
return [self objectAtIndex:value];
}
- (NSInteger)enumFromString:(NSString *)value {
return [self enumFromString:value def:0];
}
- (NSInteger)enumFromString:(NSString *)value def:(NSInteger)def {
NSInteger n = [self indexOfObject:value];
if(n == NSNotFound) n = def;
return n;
}
@end
2. enumと定義と一緒に文字列の定義をマクロで記述します
typedef NS_ENUM(NSInteger, MyType) {
kMyTypeFoo,
kMyTypeBar,
kMyTypeBaz
};
// enumと定義と一緒に文字列定義をマクロで記述
#define MyTypeStrings @[@"Foo", @"Bar", @"Baz"]
使い方
// enum -> NSString
NSString *stringValue = [MyTypeStrings stringFromEnum:kMyTypeBar];
NSLog(@"%@", stringValue);
// -> Bar
// NSString -> enum
MyType enumValue = [MyTypeStrings enumFromString:stringValue];
NSLog(@"%d", (int)enumValue);
// -> 1
// NSString(with default) -> enum
MyType enumValue2 = [MyTypeStrings enumFromString:@"undefined" def:kMyTypeFoo];
NSLog(@"%d", (int)enumValue2);
// -> 0