Ответ 1
Java getRGB()
возвращает целое число, представляющее цвет в цветовом пространстве sRGB по умолчанию (биты 24-31 - альфа, 16-23 - красный, 8-15 - зеленый, 0-7 - синий).
UIColor
не имеет такого метода, но вы можете определить свой собственный:
extension UIColor {
func rgb() -> Int? {
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
let iRed = Int(fRed * 255.0)
let iGreen = Int(fGreen * 255.0)
let iBlue = Int(fBlue * 255.0)
let iAlpha = Int(fAlpha * 255.0)
// (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue).
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return rgb
} else {
// Could not extract RGBA components:
return nil
}
}
}
Использование:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
if let rgb = swiftColor.rgb() {
print(rgb)
} else {
print("conversion failed")
}
Обратите внимание, что это будет работать только в том случае, если UIColor
был определен в
"RGB-совместимое" цветовое пространство (например, RGB, HSB или GrayScale). Это может
потерпеть неудачу, если цвет был создан из CIColor
или шаблона
изображение, в этом случае возвращается nil
.
Примечание: как заметил @vonox7, возвращаемое значение может быть отрицательным
на 32-битных платформах (что также имеет место с методом Java getRGB()
).
Если это не нужно, замените Int
на UInt
или Int64
.
Обратное преобразование -
extension UIColor {
convenience init(rgb: Int) {
let iBlue = rgb & 0xFF
let iGreen = (rgb >> 8) & 0xFF
let iRed = (rgb >> 16) & 0xFF
let iAlpha = (rgb >> 24) & 0xFF
self.init(red: CGFloat(iRed)/255, green: CGFloat(iGreen)/255,
blue: CGFloat(iBlue)/255, alpha: CGFloat(iAlpha)/255)
}
}