Search code examples
iosswiftparsinguicolor

How to create a UIColor from a String like "rgb(0,0,0)"?


I have a string from server in a format like "rgb(0,0,0)", which should be used on some UI elements.

The main problem is the various colours like "rgb(20,120,4)" etc.

Is there a way to parse it in something like UIColor(red: 0, green: 0, blue: 0, alpha: 1)?


Solution

  • There are so many possible solutions! Here is one using 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)
        }
    }
    

    Usage example:

    if let col = UIColor(rgbString: "rgb(20,120.5, 4)") {
        print(col)
    } else {
        print("invalid color specification")
    }
    

    Update for 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)
        }
    }
    

    Update for 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)
        }
    }