Skip to content

Instantly share code, notes, and snippets.

@snown
Created September 25, 2020 17:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snown/0224a2811a95b499a02c8413109a2395 to your computer and use it in GitHub Desktop.
Save snown/0224a2811a95b499a02c8413109a2395 to your computer and use it in GitHub Desktop.
an NSColor extension to convert CSS style hex string into a color and back
extension NSColor {
convenience init?(hexString: String) {
var hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
if hexString.hasPrefix("#") {
let startIndex = hexString.index(hexString.startIndex, offsetBy: 1)
hexString = String(hexString[startIndex...])
}
if hexString.count == 3 || hexString.count == 4 {
hexString = hexString.reduce(into: "") { (paddedHex, hexCharacter) in
paddedHex += "\(hexCharacter)\(hexCharacter)"
}
}
guard hexString.count == 6 || hexString.count == 8 else {
return nil
}
let scanner = Scanner(string: hexString)
var hexNumber: UInt64 = 0
if scanner.scanHexInt64(&hexNumber) {
let r, g, b, a: CGFloat
switch hexString.count {
case 6:
r = CGFloat((hexNumber & 0xFF0000) >> 16) / 255.0
g = CGFloat((hexNumber & 0x00FF00) >> 8) / 255.0
b = CGFloat(hexNumber & 0x0000FF) / 255.0
a = 1.0
default: // count == 8
r = CGFloat((hexNumber & 0xFF000000) >> 24) / 255.0
g = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255.0
b = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255.0
a = CGFloat(hexNumber & 0x000000FF) / 255.0
}
self.init(red: r, green: g, blue: b, alpha: a)
return
}
return nil
}
func hexString(includingAlpha: Bool = false) -> String {
var result = String(format: "#%02lX%02lX%02lX", lroundf(Float(redComponent) * 255), lroundf(Float(greenComponent) * 255), lroundf(Float(blueComponent) * 255))
if (includingAlpha) {
result += String(format: "%02lX", lroundf(Float(alphaComponent) * 255))
}
return result
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment