У меня есть эта функция, которая преобразует цвет в hexString:
public extension NSColor {
func getHexString() -> String {
let red = Int(round(self.redComponent * 0xFF))
let green = Int(round(self.greenComponent * 0xFF))
let blue = Int(round(self.blueComponent * 0xFF))
let hexValue = NSString(format: "#%02X%02X%02X", red, green, blue)
return hexValue
}
}
Теперь я понятия не имею, как это изменить. Все, что у меня есть, это объектно-кодовый код, но я не могу преобразовать его в быстрый.
(NSColor*)colorWithHexColorString:(NSString*)inColorString
{
NSColor* result = nil;
unsigned colorCode = 0;
unsigned char redByte, greenByte, blueByte;
if (nil != inColorString)
{
NSScanner* scanner = [NSScanner scannerWithString:inColorString];
(void) [scanner scanHexInt:&colorCode];
}
redByte = (unsigned char)(colorCode >> 16);
greenByte = (unsigned char)(colorCode >> 8);
blueByte = (unsigned char)(colorCode);
result = [NSColor
colorWithCalibratedRed:(CGFloat)redByte
green:(CGFloat)greenByte
blue:(CGFloat)blueByte
alpha:1.0];
return result;
}
Вот точно то же самое с быстрым, однако это использует UIColor, а не NSColor,
func colorWithHexColorString(var colorString: String) -> UIColor?
{
if colorString.hasPrefix("#") {
colorString = dropFirst(colorString)
}
var color: UIColor? = nil
var colorCode = UInt32()
var redByte:CGFloat = 255;
var greenByte:CGFloat = 255;
var blueByte: CGFloat = 255;
let scanner = NSScanner(string: colorString)
if scanner.scanHexInt(&colorCode) {
redByte = CGFloat(colorCode & 0xff0000)
greenByte = CGFloat(colorCode & 0x00ff00)
blueByte = CGFloat(colorCode & 0xff)
color = UIColor(red: redByte, green: greenByte, blue: blueByte, alpha: 1.0)
}
return color
}
colorWithHexColorString("#ffff00")
colorWithHexColorString("ff0000")
Я не могу поверить, что я это делаю, но со всем уважением я был обеспокоен тем, как "безумный 36" прибегал к NSScanner и NSString - все это просто показалось слишком тяжелым - вот и моя "чистая" версия Swift, который на самом деле не является "чистым", потому что в итоге я назвал strtol
:
func hexStringToColor(var s:String) -> UIColor {
if s.hasPrefix("#") { s = dropFirst(s) }
var arr = [String]()
for i in stride(from: 0, through: 4, by: 2) {
let ix = advance(s.startIndex,i)
let ix2 = advance(s.startIndex,i+1)
arr.append(s[ix...ix2])
}
let rgb = arr.map{CGFloat(strtol($0,nil,16))/255.0}
return UIColor(red: rgb[0], green: rgb[1], blue: rgb[2], alpha: 1)
}
colorString = colorString.substringWithRange(NSMakeRange(1, colorString.length - 1))
Yecccccch! Вы можете сделать это так много более плотно и разборчиво - и не опуская в Фонд - просто позвонив по телефонуdropFirst(colorString)
.