有很多可能的解决方案!这是一个使用
NSScanner:
extension UIColor {
convenience init?(rgbString : String) {
var red = 0.0
var green = 0.0
var blue = 0.0
let scanner = NSScanner(string : rgbString)
guard scanner.scanString("rgb(", intoString: nil)
&& scanner.scanDouble(&red)
&& scanner.scanString(",", intoString: nil)
&& scanner.scanDouble(&green)
&& scanner.scanString(",", intoString: nil)
&& scanner.scanDouble(&blue)
&& scanner.scanString(")", intoString: nil) else {
return nil
}
self.init(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue/255.0), alpha: 1.0)
}
}
使用示例:
if let col = UIColor(rgbString: "rgb(20,120.5, 4)") {
print(col)
} else {
print("invalid color specification")
}
Swift 3/4 更新:
extension UIColor {
convenience init?(rgbString: String) {
var red = 0.0
var green = 0.0
var blue = 0.0
let scanner = Scanner(string: rgbString)
guard scanner.scanString("rgb(", into: nil)
&& scanner.scanDouble(&red)
&& scanner.scanString(",", into: nil)
&& scanner.scanDouble(&green)
&& scanner.scanString(",", into: nil)
&& scanner.scanDouble(&blue)
&& scanner.scanString(")", into: nil) else {
return nil
}
self.init(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue/255.0), alpha: 1.0)
}
}
Swift 5 更新:
extension UIColor {
convenience init?(rgbString: String) {
let scanner = Scanner(string: rgbString)
guard scanner.scanString("rgb(") != nil,
let red = scanner.scanDouble(),
scanner.scanString(",") != nil,
let green = scanner.scanDouble(),
scanner.scanString(",") != nil,
let blue = scanner.scanDouble(),
scanner.scanString(")") != nil else {
return nil
}
self.init(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue/255.0), alpha: 1.0)
}
}