Преобразовать NSString в UInt8 в функции в Swift?

Я создаю приложение Swift в Xcode, которое отправляет команду адаптеру BLE, чтобы подключенные к нему светодиоды изменились на другой цвет.

Как я установил из ответа на предыдущий пост на SO, мне нужно отправить команду в виде шестнадцатеричных целых чисел в массиве. Для этого я использую следующий код:

let bytes : [UInt8] = [ 0x52, 0x13, 0x00, 0x56, 0xFF, 0x00, 0x00, 0x00, 0xAA ]
let data = NSData(bytes: bytes, length: bytes.count)

Следовательно, для этого требуется форма UInt8, как было предложено выше.

Тем не менее, я пытаюсь использовать ползунки в качестве средств выбора цвета в своем приложении Swift, чтобы установить цвета R, G и B светодиодной ленты, подключенной к приемнику BLE. Для этого я создал три ползунка для R, G и B соответственно, установив минимальное значение каждого на 0, а максимальное на 255 (поскольку 255 преобразуется в FF в шестнадцатеричном формате). Затем я использую следующую функцию для преобразования их в шестнадцатеричную форму, которую я могу реализовать в приведенной выше команде.

func colorToHex(input: Int) -> UInt8 {
    var st = NSString(format: "%2X", input)
    return st
}

Проблема в том, что я должен снова вернуть значение UInt8. Поскольку «st» является NSString, Xcode выдает ошибку «NSString, не конвертируемая в UInt8».

Я довольно новичок в Swift. Вопрос здесь в том, как заставить функцию возвращать значение UInt8, как мне заставить ее формировать значение UInt8?

Любая помощь будет принята с благодарностью!


person beninabox_uk    schedule 04.08.2015    source источник
comment
Ваш вопрос не ясен. когда ввод 255, что вы хотите, это 255 как UInt8? или [70, 70]([0x46, 0x46]), который является CString-представлением "FF"?   -  person rintaro    schedule 04.08.2015
comment
Мои извинения за неясный вопрос здесь. Например, я хочу, чтобы если ползунок был перемещен на максимум (255), я хочу, чтобы он каким-то образом был преобразован в 0xFF, чтобы его можно было добавить в массив байтов. Точно так же, если бы на ползунке было установлено значение 150, оно было бы преобразовано в 0x96, чтобы его можно было ввести также в массив байтов. Он должен быть в форме UInt8.   -  person beninabox_uk    schedule 04.08.2015


Ответы (2)


Нет необходимости использовать NSString или Int. Если redSlider - это ваш UISlider с минимальным значением 0 и максимальным значением 255, вы можете просто вычислить

let redByte = UInt8(redSlider.value)

и используйте это в своем массиве bytes:

var bytes : [UInt8] = [ 0x52, 0x13, 0x00, 0x56, 0xFF, 0x00, 0x00, 0x00, 0xAA ]
bytes[0] = redByte // Assuming that the first array element is for red.
person Martin R    schedule 04.08.2015
comment
Спасибо за ответ. Сделает ли это красный цвет шестнадцатеричным значением? - person beninabox_uk; 04.08.2015
comment
@BensTechTips: Этот вопрос не имеет смысла. 0x64 и 100 — это просто два разных способа записи одного и того же числа. Попробуйте let x = 0x64; println(x) ! – Приведенный выше код преобразует Float (в диапазоне 0 .. 255) в UInt8, и это все, что вам нужно. - person Martin R; 04.08.2015
comment
Ах я вижу! Спасибо за это! Мне потребовалось некоторое время, чтобы решить это! Я думаю, вы говорите, что я могу просто ввести десятичные значения (например, 255), и они будут введены в массив. Спасибо! - person beninabox_uk; 04.08.2015

Только что

func colorToHex(input: Int) -> UInt8 {
    return UInt8(input % (Int(UInt8.max) + 1))
}



NSString(format: "%2X", colorToHex(25))  // "19"

NSString(format: "%2X", colorToHex(254)) // "FE"

NSString(format: "%2X", colorToHex(255)) // "FF"

NSString(format: "%2X", colorToHex(256)) //  "0"

На вашем месте я бы использовал NSString(format: "%0x", colorToHex(25)) // "19" В вашем случае у вас есть пробел, если число имеет один символ

person Tikhonov Alexander    schedule 04.08.2015
comment
Спасибо за ответ. Однако это, похоже, также приводит к ошибке. 'Двоичный оператор % не может применяться к операндам типа Int и (UInt8)' - person beninabox_uk; 04.08.2015