以前紹介したMantleのTipです。
Mantleを使えば、モデル内ではUIColor
を用いておいて、JSONに保存するときはHTMLのように#eecad9
みたいに出力させる、なんてことが割と簡単にできます。
例えば次のようなモデルがあったときに、
@interface FOOSampleModel : MTLModel<MTLJSONSerializing> @property (assign, nonatomic) UIColor* textColor; @end
+ (MTLValueTransformer*)textColorJSONTransformer
を実装すればよいです。
Mantleでは「キー名+JSONTransformer
」を実装すると自動でそのプロパティとJSONの相互変換するようになります。
あとはその中身を書くだけです (ちょっと長いですが)。
戻り値としてNSValueTransformer
を返す必要がありますが、Mantle的には
MTLValueTransformer
でデシリアライズとシリアライズを実行するblockをそれぞれ書いてやればよいです。
+ (NSValueTransformer*)textColorJSONTransformer { return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString* string) { NSError* error = nil; NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^#([0-9a-f]{6})$" options:NSRegularExpressionCaseInsensitive error:&error]; NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; if (matches.count != 1) return [UIColor blackColor]; NSTextCheckingResult* m = matches[0]; NSString* col = [string substringWithRange:[m rangeAtIndex:1]]; NSScanner* scanner = [NSScanner scannerWithString:col]; unsigned int result = 0; [scanner scanHexInt:&result]; CGFloat red = ((result>>16) & 0xff) / 255.0f; CGFloat green = ((result>>8) & 0xff) / 255.0f; CGFloat blue = (result & 0xff) / 255.0f; return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f]; } reverseBlock:^(UIColor* color) { CGFloat red, green, blue, alpha; [color getRed:&red green:&green blue:&blue alpha:&alpha]; int r = (int) (red * 255); int g = (int) (green * 255); int b = (int) (blue * 255); return [NSString stringWithFormat:@"#%02x%02x%02x", r, g, b]; }]; }
試しにシリアライズしてみましょう。
FOOSampleModel* model = [[FOOSampleModel alloc] init]; model.textColor = [UIColor purpleColor]; NSDictionary* dic = [MTLJSONAdapter JSONDictionaryFromModel:model]; NSLog(@"%@", dic);
シリアライズできました。
2013-12-12 01:16:27.257 XcodeSample[22519:70b] { textColor = "#7f007f"; }
コードは省略しますが、デシリアライズもちゃんとできます。
2013-12-12 01:16:10.506 XcodeSample[22519:70b] des: <FOOSampleModel: 0x8c97510> { textColor = "UIDeviceRGBColorSpace 0.498039 0 0.498039 1"; }
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。