Я согласен с ответами, которые рекомендуют использовать NSData для хранения цветов в хранилище основных данных. Тем не менее, могут быть моменты, когда может быть полезно сохранить цвет в строке, и это, безусловно, не сложно сделать. Я хотел бы предложить создать категорию на NSColor:
@interface NSColor (NSString)
- (NSString*)stringRepresentation;
+ (NSColor*)colorFromString:(NSString*)string forColorSpace:(NSColorSpace*)colorSpace;
@end
@implementation NSColor (NSString)
- (NSString*)stringRepresentation
{
CGFloat components[10];
[self getComponents:components];
NSMutableString *string = [NSMutableString string];
for (int i = 0; i < [self numberOfComponents]; i++) {
[string appendFormat:@"%f ", components[i]];
}
[string deleteCharactersInRange:NSMakeRange([string length]-1, 1)]; // trim the trailing space
return string;
}
+ (NSColor*)colorFromString:(NSString*)string forColorSpace:(NSColorSpace*)colorSpace
{
CGFloat components[10]; // doubt any color spaces need more than 10 components
NSArray *componentStrings = [string componentsSeparatedByString:@" "];
int count = [componentStrings count];
NSColor *color = nil;
if (count <= 10) {
for (int i = 0; i < count; i++) {
components[i] = [[componentStrings objectAtIndex:i] floatValue];
}
color = [NSColor colorWithColorSpace:colorSpace components:components count:count];
}
return color;
}
@end
Я проверил, что приведенный выше код компилируется и работает примерно как рекламируется. Небольшой образец программа выдает соответствующий вывод:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"Red is: %@", [[NSColor redColor] stringRepresentation]);
NSLog(@"Cyan is: %@", [[NSColor cyanColor] stringRepresentation]);
NSLog(@"Read in: %@", [NSColor colorFromString:[[NSColor redColor] stringRepresentation]
forColorSpace:[NSColorSpace deviceRGBColorSpace]]);
}
return 0;
}
Выход:
Red is: 1.000000 0.000000 0.000000 1.000000
Cyan is: 0.000000 1.000000 1.000000 1.000000
Read in: NSCustomColorSpace Generic RGB colorspace 1 0 0 1
Это может иметь смысл для сохранения цветового пространства в строке, так что вы не должны указывать его при переходе из строки раскрасить. Опять же, если вы просто собираетесь хранить эти строки и читать их снова, вы все равно должны использовать NSData. Использование строк имеет больше смысла, если вам нужно писать цвета в какой-то читаемый человеком файл или, возможно, в качестве вспомогательной помощи.