我正在尝试将使用预定义颜色列表的现有程序从 Objective-C 转换为 Swift。
原始代码使用Selector来提取一个UIColor
基于它的名称表示为NSString
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
-(UIColor *)getColor:(NSString*)colorName
{
SEL selColor = NSSelectorFromString(colorName);
NSString *errorMessage = [NSString stringWithFormat:@"Invalid color name: %@ !!!", colorName];
NSAssert([UIColor respondsToSelector:selColor] == YES, errorMessage);
UIColor *mycolor = [UIColor performSelector:selColor];
return mycolor;
}
+ (instancetype)turquoiseColor {
return UIColorFromRGB(0x40E0D0);
}
+ (instancetype)mediumTurquoiseColor {
return UIColorFromRGB(0x48D1CC);
}
然而,我一直无法弄清楚如何使用 Swift 3.0 实现相同的功能,或者使用 Selector 是否是最好的技术。
func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
extension UIColor {
public class var turquoise: UIColor { return UIColorFromRGB(0x40E0D0) }
}
extension UIColor {
public class var mediumTurquoise: UIColor { return UIColorFromRGB(0x48D1CC) }
}
let myColor: UIColor = .turquoise
let name: String = "turquoise"
let colorName = "UIColor.\(name)"
let selector: Selector = NSSelectorFromString(colorName)
let colorSelected: UIColor = UIColor.perform(selector!)
错误: !没有“执行”候选者产生预期的上下文结果类型“UIColor”
您可以创建一个默认值为 String 的 Color 枚举:
enum Color: String {
case red
case blue
case green
var create: UIColor {
switch self {
case .red:
return UIColor.red
case .blue:
return UIColor.blue
case .green:
return UIColor.green
}
}
}
由于它具有 String 的默认值,因此您可以使用字符串初始化枚举:
guard let color = Color(rawValue: "red") else { "handle invalid color error"; return }
let colorSelected = color.create //// colorSelected is now UIColor.red
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)