Определить категорию для UIColor
:
В UIColor + MyColors.h:
@interface UIColor (MyColors)
+ (UIColor *)skyColor;
+ (UIColor *)dirtColor;
// and the rest of them
@end
В UIColor + MyColors.m:
@implementation UIColor (MyColors)
+ (UIColor *)skyColor {
static UIColor color = nil;
if (!color) {
// replace r, g, and b with the proper values
color = [UIColor colorWithRed:r green:g blue:b alpha:1];
}
return color;
}
+ (UIColor *)dirtColor {
static UIColor color = nil;
if (!color) {
// replace r, g, and b with the proper values
color = [UIColor colorWithRed:r green:g blue:b alpha:1];
}
return color;
}
// and the rest
@end
Edit:
Как Martin R указывает, более современный подход к инициализации статической color
переменной будет:
+ (UIColor *)skyColor {
static UIColor color = nil;
static dispatch_once_t predicate = 0;
dispatch_once(&predicate, ^{
// replace r, g, and b with the proper values
color = [UIColor colorWithRed:r green:g blue:b alpha:1];
});
return color;
}
Это на самом деле может быть излишним в этом случае, так как нет плохой побочный эффект, если два потока выполняют инициализацию статической переменной nil
в то же время с использованием исходного кода. Но лучше использовать dispatch_once
.
Почему вы используете статическую переменную цвета вместо того, чтобы возвращать результат colorWithRed: green: blue: alpha? Скорость для последующих запросов? Разве цвет var не будет переопределен каждый раз, когда запрашивается новый цвет? – JeffRegan
@JeffCompton Я использовал статику, поэтому цвет создается только один раз. Это небольшая оптимизация. Каждый статический объект привязан к методу, в котором он находится, поэтому они не мешают друг другу. Не отличается от наличия нестатической переменной с тем же именем двумя разными способами. – rmaddy
Примечание. Использование 'dispatch_once()' может быть более «современным» способом и сделает инициализацию потокобезопасной. –