【问题标题】:Convert NSString to UInt8 in a function in Swift?在 Swift 的函数中将 NSString 转换为 UInt8?
【发布时间】:2015-10-26 18:43:39
【问题描述】:

我正在 Xcode 中创建一个 Swift 应用程序,该应用程序向 BLE 适配器发送命令,以使与其连接的 LED 变为不同的颜色。

正如我从对 SO 上一篇文章的回复中确定的那样,我必须以数组中的十六进制整数形式发送命令。我正在使用以下代码来执行此操作:

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

因此,这需要上面建议的 UInt8 表单。

但是,我正在尝试在我的 Swift 应用程序上使用滑块作为颜色选择器,以便设置连接到 BLE 接收器的 LED 灯条的 R、G 和 B 颜色。为了做到这一点,我分别为 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 not convertible to UInt8' 的错误。

我对 Swift 还很陌生。这里的问题是,如何让函数返回 UInt8 值,如何让函数形成 UInt8 值?

任何帮助将不胜感激!

【问题讨论】:

  • 您的问题不清楚。当输入为255 时,你想要的是255 作为UInt8?或[70, 70]([0x46, 0x46]) 是"FF" 的CString 表示?
  • 对于这里不清楚的问题,我深表歉意。例如,我想要的是,如果滑块移动到最大值 (255),那么我希望它以某种方式转换为 0xFF,以便可以将其添加到字节数组中。类似地,如果它在滑块上设置为 150,它将被转换为 0x96,这样它也可以输入到字节数组中。它需要是 UInt8 格式。

标签: ios swift bluetooth nsdata uint8t


【解决方案1】:

无需使用NSStringInt。如果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.

【讨论】:

  • 感谢您的回复。这会使红色成为十六进制值吗?
  • @BensTechTips:这个问题毫无意义。 0x64100 只是写 same 数字的两种不同方式。试试let x = 0x64; println(x)! – 上面的代码将 Float(在 0 .. 255 范围内)转换为 UInt8,这就是您所需要的。
  • 啊,我明白了!谢谢你!我花了一段时间才解决这个问题!我猜你是说我可以只输入十进制值(例如 255),它就会被输入到数组中。谢谢!
【解决方案2】:

只是

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" 在您的情况下,如果数字有一个符号,则您有空格

【讨论】:

  • 感谢您的回复。但是,这似乎也会导致错误。 '二元运算符 % 不能应用于 Int 和 (UInt8) 类型的操作数'
猜你喜欢
  • 2016-07-24
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多