Swift-从UIColor转换为字符串时UIColor.black导致应用崩溃

时间:2019-01-22 04:07:10

标签: swift uikit uicolor rgba

例如,下面的代码可与UIColor.Purple或UIColor.Yellow配合使用,但是当我使用UIColor.black时,应用程序崩溃。

致命错误:索引超出范围 当使用UIColor.black时,components [2]和[3]似乎不存在。我知道我要用力打开包装,但不是所有颜色都应具有RGBA吗?

//UIColor RGBA to string
public extension UIColor {

class func StringFromUIColor(color: UIColor) -> String{
    let components = color.cgColor.components
    return "[\(components![0]), \(components![1]), \(components![2]), \(components![3])]"
}

class func UIColorFromString(string: String) -> UIColor {
    let componentsStringStepOne = string.replacingOccurrences(of: "[", with: "")
    let componentsString = componentsStringStepOne.replacingOccurrences(of: "]", with: "")
    let components = componentsString.components(separatedBy: ", ")
    return UIColor(red: CGFloat((components[0] as NSString).floatValue), green: CGFloat((components[1] as NSString).floatValue), blue: CGFloat((components[2] as NSString).floatValue), alpha: CGFloat((components[3] as NSString).floatValue))
}

}

还有更好的方法来编写这部分代码吗?

let componentsStringStepOne = string.replacingOccurrences(of: "[", with: "")
    let componentsString = componentsStringStepOne.replacingOccurrences(of: "]", with: "")
    let components = componentsString.components(separatedBy: ", ")

任何帮助都值得赞赏!谢谢。

1 个答案:

答案 0 :(得分:0)

这是我根据rmaddy和kamran响应提出的解决方案。它不会崩溃的应用程序,我得到正确的颜色。它在plist中保存了我希望它是黑色还是彩色的外观。 [0.2,0.4,0.5,1.0]。 感谢您的帮助

public extension UIColor {

class func StringFromUIColor(color: UIColor) -> String{
    let components = color.cgColor.components
    if components?.count == 2 {
         return "[\(components![0]), \(components![0]), \(components![0]), \(components![1])]"
    } else {
        return "[\(components![0]), \(components![1]), \(components![2]), \(components![3])]"
    }
}

class func UIColorFromString(string: String) -> UIColor {
    let componentsStringStepOne = string.replacingOccurrences(of: "[", with: "")
    let componentsString = componentsStringStepOne.replacingOccurrences(of: "]", with: "")
    let components = componentsString.components(separatedBy: ", ")
    if components.count == 2 {
        return UIColor(white: CGFloat((components[0] as NSString).floatValue), alpha: CGFloat((components[1] as NSString).floatValue))
    } else {
          return UIColor(red: CGFloat((components[0] as NSString).floatValue), green: CGFloat((components[1] as NSString).floatValue), blue: CGFloat((components[2] as NSString).floatValue), alpha: CGFloat((components[3] as NSString).floatValue))
    }
  }
}