当前位置 : 主页 > 手机开发 > ios >

ios – 从NSString获取UIColor类型的#define

来源:互联网 收集:自由互联 发布时间:2021-06-11
我定义了以下常量,每个常量代表一个UIColor: // Purple#define PURPLE_COLOR_DARK [UIColor colorWithRed: 0.42 green: 0.25 blue: 0.60 alpha: 1.0]#define PURPLE_COLOR_LIGHT [UIColor colorWithRed: 0.78 green: 0.47 blue: 0.72 alpha
我定义了以下常量,每个常量代表一个UIColor:

// Purple
#define PURPLE_COLOR_DARK  [UIColor colorWithRed: 0.42 green: 0.25 blue: 0.60 alpha: 1.0]
#define PURPLE_COLOR_LIGHT [UIColor colorWithRed: 0.78 green: 0.47 blue: 0.72 alpha: 1.0]

// Blue
#define BLUE_COLOR_DARK  [UIColor colorWithRed: 0.00 green: 0.46 blue: 0.70 alpha: 1.0]
#define BLUE_COLOR_LIGHT [UIColor colorWithRed: 0.00 green: 0.75 blue: 0.88 alpha: 1.0]

// Magenta
#define MAGENTA_COLOR_DARK  [UIColor colorWithRed: 0.75 green: 0.00 blue: 0.28 alpha: 1.0]
#define MAGENTA_COLOR_LIGHT [UIColor colorWithRed: 1.00 green: 0.32 blue: 0.61 alpha: 1.0]

如何使用像@“purple”,@“blue”或@“magenta”这样的NSString来获取相关的“X_COLOR_DARK”或“X_COLOR_LIGHT”常量?甚至可以直接这样做吗?

这是错误的,但应该更清楚地了解我的要求.在这个例子中,我有字符串@“blue”,并希望派生BLUE_COLOR_DARK和BLUE_COLOR_LIGHT颜色值.

NSString *color = @"blue";
UIColor *darkColor = (UIColor *)[[NSString stringWithFormat: @"%@_COLOR_DARK", color] uppercaseString];

// Debugging    
NSLog(@"%@", darkColor); // BLUE_COLOR_DARK
NSLog(@"%hhd", [lightColor isKindOfClass: [UIColor class]]);  // 0
NSLog(@"%hhd", [lightColor isKindOfClass: [NSString class]]); // 1

跟进

请注意,UIColor不一定与回答问题相关,尽管它对我的情况有帮助.更具体地说,我问的是,匹配已定义名称的字符串(例如@“PURPLE_COLOR_DARK”和#define PURPLE_COLOR_DARK)是否可以解释为定义的名称,而不是直接使用定义的名称.

放弃#defines.并使用UIColor类别和NSSelectorFromString,如 this answer中所述.

或者,创建一个NSDictionary,其中键是颜色的名称,对象是您的颜色.然后,您可以按名称获取UIColor.

例如.:

NSDictionary *colors = @{ @"purple_dark"  : PURPLE_COLOR_DARK,
                          @"purple_light" : PURPLE_COLOR_LIGHT };

NSString *colorName = @"purple";

NSString *lightColorName = [colorName stringByAppendingString:@"_light"];
NSString *darkColorName = [colorName stringByAppendingString:@"_dark"];

UIColor *lightColor = colors[lightColorName];
UIColor *darkColor = colors[darkColorName];

您不能直接使用#defined名称,因为这些名称在编译的代码中不存在.在编译期间,预处理器将用[UIColor …]替换所有出现的PURPLE_COLOR_DARK

网友评论