これは、色の「プライベート」フォーマットの自由度に依存します。一部の色は、RGBA を要求されてもうまく反応しません (そのため、get...
メソッドが a を返すのはなぜでしょうか。BOOL
常に成功するとは限りません)。そのため、この実装には色の種類と値が含まれています。
@implementation UIColor (JSON)
- (NSString *)json_stringValue
{
CGFloat r, g, b, a, h, s, w;
if ([self getRed:&r green:&g blue:&b alpha:&a])
return [NSString stringWithFormat:@"rgba:%f,%f,%f,%f", r,g,b,a];
else if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [NSString stringWithFormat:@"hsba:%f,%f,%f,%f", h,s,b,a];
else if ([self getWhite:&w alpha:&a])
return [NSString stringWithFormat:@"wa:%f,%f", w, a];
NSLog(@"WARNING: unable to serialize color %@", self);
return nil;
}
@end
@implementation NSString (JSON)
- (UIColor *)json_color
{
NSArray *comps = [self componentsSeparatedByString:@":"];
NSArray *colors = [comps[1] componentsSeparatedByString:@","];
NSUInteger count = colors.count;
CGFloat values[4] = {0,0,0,0};
for (NSUInteger i = 0; i < count; i++) values[i] = [colors[i] floatValue];
if ([comps[0] isEqualToString:@"rgba"])
return [UIColor colorWithRed:values[0] green:values[1] blue:values[2] alpha:values[3]];
else if ([comps[0] isEqualToString:@"hsba"])
return [UIColor colorWithHue:values[0] saturation:values[1] brightness:values[2] alpha:values[3]];
else if ([comps[0] isEqualToString:@"wa"])
return [UIColor colorWithWhite:values[0] alpha:values[1]];
NSLog(@"WARNING: unable to deserialize color %@", self);
return nil;
}
@end