如何在 Swift 3.0 中将字符串转换为 UIColor? [英] How to convert a String to UIColor in Swift 3.0?

查看:39
本文介绍了如何在 Swift 3.0 中将字符串转换为 UIColor?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将使用预定义颜色列表的现有程序从 Objective-C 转换为 Swift.原始代码使用 Selector 根据表示为 NSString

的名称提取 UIColor

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >;> 8))/255.0 蓝色:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]-(UIColor *)getColor:(NSString*)colorName{SEL selColor = NSSelectorFromString(colorName);NSString *errorMessage = [NSString stringWithFormat:@"无效颜色名称:%@ !!!", colorName];NSAssert([UIColor RespondsToSelector:selColor] == YES, errorMessage);UIColor *mycolor = [UIColor performSelector:selColor];返回我的颜色;}+ (instancetype)turquoiseColor {返回 UIColorFromRGB(0x40E0D0);}+ (instancetype)mediumTurquoiseColor {返回 UIColorFromRGB(0x48D1CC);}

然而,我一直无法弄清楚如何使用 Swift 3.0 实现相同的功能,或者使用 Selector 是否是最好的技术.

func UIColorFromRGB(_ rgbValue: UInt) ->界面颜色{返回 UIColor(红色:CGFloat((rgbValue & 0xFF0000) >> 16)/255.0,绿色:CGFloat((rgbValue & 0x00FF00) >> 8)/255.0,蓝色:CGFloat(rgbValue & 0x0000FF)/255.0,阿尔法:CGFloat(1.0))}扩展 UIColor {公共类 var 绿松石:UIColor { return UIColorFromRGB(0x40E0D0) }}扩展 UIColor {公共类 var mediumTurquoise: UIColor { return UIColorFromRGB(0x48D1CC) }}让 myColor: UIColor = .turquoise让名称:String =绿松石"let colorName = "UIColor.\(name)"让选择器: Selector = NSSelectorFromString(colorName)让 colorSelected: UIColor = UIColor.perform(selector!)

<块引用>

错误:!没有执行"候选人产生预期的上下文结果类型UIColor"

解决方案

您可以创建一个默认值为 String 的 Color 枚举:

 枚举颜色:字符串 {案例红色案例蓝色案例绿色变量创建:UIColor {切换自我{案例.红色:返回 UIColor.red案例.blue:返回 UIColor.blue案例.绿色:返回 UIColor.green}}}

因为它有一个默认值 String 你可以用一个字符串初始化枚举:

 guard let color = Color(rawValue: "red") else { "处理无效颜色错误";返回 }let colorSelected = color.create////colorSelected 现在是 UIColor.red

I am trying to convert an existing program which uses a list of predefined colors from Objective-C to Swift. The original code used Selector to extract a UIColor based on it name represented as a 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);
}

However, I have been unable to work out how to achieve the same functionality using Swift 3.0, or whether the use of Selector is even the best technique.

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!)

Error: ! No 'perform' candidates produce the expected contextual result type 'UIColor'

解决方案

You can create a Color enum that has a default value of String:

 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
       }
    }
  }

Since it has a default value of String you can initialize the enum with a string:

  guard let color = Color(rawValue: "red") else { "handle invalid color error"; return } 

 let colorSelected = color.create //// colorSelected is now UIColor.red

这篇关于如何在 Swift 3.0 中将字符串转换为 UIColor?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆