Преобразование шестнадцатеричного цвета в виде строки в Uint

Я искал это целую вечность и не могу найти решение, которое работает или которое я понимаю.

У меня есть строка в базе данных «0x6c8c93», которую я хочу преобразовать в Uint, чтобы я мог преобразовать ее в цвет.

Ниже приведена функция, которую я использовал для преобразования Uint в цвет ранее. и я только что передал ему шестнадцатеричное значение из цветовых диаграмм в этом формате 0x6c8c93. Однако теперь мне нужно извлечь некоторые значения из БД, поэтому мне нужно использовать строку.

class func UIColorFromHEX(hexValue: UInt) -> UIColor {
    return UIColor(
        red: CGFloat((hexValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((hexValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(hexValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

Спасибо за помощь.


person Pippo    schedule 25.01.2017    source источник
comment
Не точный дубликат, потому что формат вашей строки немного отличается, но здесь есть много отличных идей: stackoverflow.com/q/1560081/1630618< /а>   -  person vacawama    schedule 25.01.2017


Ответы (3)


Вот один из способов сделать это. Используйте String(string.characters.suffix(6)) для сохранения последних 6 символов строки, а затем используйте инициализатор UInt UInt(_:radix:) для преобразования hexString в UInt.

let string = "0x6c8c93"

if let hexValue = UInt(String(string.characters.suffix(6)), radix: 16) {
    // create the color from hexValue
}
person vacawama    schedule 25.01.2017
comment
вам не нужно удалять последние шесть символов. он также должен работать с префиксом 0x: let hexValue = UInt(hexString, radix: 16) - person muescha; 25.01.2017
comment
@muescha, нет. Вы получите nil, если оставите там 0x. - person vacawama; 25.01.2017
comment
Спасибо за это, отлично работает, и спасибо за объяснение, как это работает. - person Pippo; 25.01.2017

С учетом второго ответа здесь попробуйте это :

public func UIColorFromRGB(_ rgbValue: String) -> UIColor {
    return UIColor(
        red: CGFloat((rgbValue.hexaToInt & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue.hexaToInt & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue.hexaToInt & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

extension String {
    var hexaToInt      : Int    { return Int(strtoul(self, nil, 16))      }
    var hexaToDouble   : Double { return Double(strtoul(self, nil, 16))   }
    var hexaToBinary   : String { return String(hexaToInt, radix: 2)      }
    var decimalToHexa  : String { return String(Int(self) ?? 0, radix: 16)}
    var decimalToBinary: String { return String(Int(self) ?? 0, radix: 2) }
    var binaryToInt    : Int    { return Int(strtoul(self, nil, 2))       }
    var binaryToDouble : Double { return Double(strtoul(self, nil, 2))   }
    var binaryToHexa   : String { return String(binaryToInt, radix: 16)  }
}

extension Int {
    var binaryString: String { return String(self, radix: 2)  }
    var hexaString  : String { return String(self, radix: 16) }
    var doubleValue : Double { return Double(self) }
}

//"ff".hexaToInt              // "255"
//"ff".hexaToDouble           // "255.0"
//"ff".hexaToBinary           // "11111111"
//"255".intToHexa             // "ff"
//"255".intToBinary           // "11111111"
//"11111111".binaryToInt      // "255"
//"11111111".binaryToDouble   // "255.0"
//"11111111".binaryToHexa     // "ff"
//255.binaryString            // "11111111"
//255.hexaString              // "ff"
//255.doubleValue             // 255.0

Это сработало для меня.

person dfd    schedule 25.01.2017
comment
в исходном ответе есть неудобство с именованием: decimalToHexa -> intToHexa' and decimalToBinary` -> intToBinary - person muescha; 25.01.2017
comment
Я не уверен, что вы говорите, но: (1) ОП принял ответ - это все, что меня волнует - (2) ОП предложил, чтобы шестнадцатеричные значения хранились в виде строки, а не Uint - я использую точный та же функция, что и в ОП, поэтому (3) пока я оставлю ответ там. Я указал, где я нашел код, который я использовал, он включает в себя гораздо больше преобразований, если это необходимо, и я всегда уважал комментарии и ответы @vacawama. Думаю, я поступаю правильно. Но если нет, я с удовольствием удалю это. (После того, как я сохраню его для своего использования в будущем!) Мир. - person dfd; 25.01.2017
comment
? ты отвечаешь нормально. я только предположил, что между hexaToInt существует несоответствие имен, но обратное имя decimalToHexa и должно быть лучше intToHexa. просто отмечая больше жалоб - person muescha; 25.01.2017

Обновление до SwiftUI и Swift5

let string = "0x6c8c93"

let hexValue = UInt32(String(string.suffix(6)), radix: 16)
//This will return the UInt32 ready to be converted to a color

Это основано на ответе @vacawama

person Santiago Yeomans    schedule 28.01.2021