#objective-c #nsdictionary
#objective-c #nsdictionary
Вопрос:
как я могу это сделать? В принципе, я хочу сохранить значения цвета RGB, которые могут быть получены в ответ на название цвета. Мой код на C использует boost unordered_map для этого:
("SlateBlue1", Color(0.5137f, 0.4353f,1.0f))
("tan3", Color(0.8039f, 0.5216f, 0.2471f))
("grey32", Color(0.3216f, 0.3216f, 0.3216f))
Color — это класс, который хранит 3 значения.
Попытка сделать это в Objective-C приводит к запутыванию меня в узлах и странным ошибкам! Большинство примеров словаря, которые я нашел, просто сопоставляют 2 строки. Конечно, я могу просто использовать код C в файле .mm, но если у кого-нибудь есть какие-либо идеи, как достичь этого способом Obj-C, я был бы рад узнать, спасибо.
Ответ №1:
В Cocoa то же самое — используйте NSDictionary вместо unordered_map, NSString вместо const char * для ключа и UIColor вместо Color для объекта, и все готово.
Например, [NSDictionary dictionaryWithObject: [UIColor redColor] forKey: @"Red"]]
для создания карты с одним входом. Настройте несколько цветов, и все готово. Используйте NSColor, если вы не на iOS.
Возможно, вы упускаете ключевой момент, что словарь является (почти) нетипизированной коллекцией, поэтому он может хранить разнородный набор типов объектов, используя разнородный набор типов ключей.
Ответ №2:
Если ваш объект color расширяет NSObject, вы должны иметь возможность сохранять эти цвета в качестве значений в вашем NSDictionary
.
NSDictionary *colors = [[NSDictionary alloc] initWithObjectsAndKeys:Color1, @"SlateBlue1", Color2, @"tan3", Color3, @"grey32", nil ];
Это должно сработать, и тогда вы будете использовать
Color *mycolor = [colors objectForKey:@"SlateBlue1"];
А затем получите доступ к вашим цветам из вашего объекта.
Кроме того, не уверен в назначении вашего объекта color, но вы могли бы использовать NSColor
для Cocoa или UIColor
для Cocoa-touch, чтобы сохранить их также.
(Я не тестировал этот код, просто записал из памяти)
Комментарии:
1. Привет, Брайан, спасибо, как мне избежать утечки всех цветных объектов, которые создаются для словаря, они скопированы туда? Они уничтожаются, когда это делает словарь, или их следует освобождать отдельно?
2. Если вы используете один из методов класса UIColor, таких как
[UIColor redColor]
или[UIColor colorWithRed:.5 green:.2 blue:.7 alpha:1]
, вам не нужно беспокоиться о их утечке. Вы не получаете ссылку «owning», поэтому вам не нужно ее освобождать, и NSDictionary сохранит и выпустит ее при необходимости.
Ответ №3:
Если вы хотите использовать UIColor
объект или аналогичный, другие ответы охватывают это. Если вы действительно хотите сохранить три значения с плавающей запятой, у вас есть пара вариантов. Вы можете сохранить NSArray из трех NSNumbers для каждой тройки значений с плавающей запятой:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:[NSNumber numberWithFloat:.5], [NSNumber numberWithFloat:.7], [NSNumber numberWithFloat:.2], nil], @"bleem",
... // more array/string pairs
nil];
Или вы можете использовать NSData
для каждой тройки значений с плавающей запятой:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
[NSData dataWithBytes:amp;(float[]){ .5, .7, .2} length:3*sizeof(float)], @"bleem",
... // more data/string pairs
nil];