我分叉了这个项目,所以我不太熟悉所有细节:https://github.com/nebs/hello-bluetooth/blob/master/HelloBluetooth/NSData%2BInt8.swift https://github.com/nebs/hello-bluetooth/blob/master/HelloBluetooth/NSData%2BInt8.swift.
这是 NSData 扩展的一部分,我用它来向 Arduino 发送 8 位值。
func int8Value() -> Int8 {
var value: Int8 = 0
copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size) //BUG
return value
}
然而,在 Swift 3 中,这现在会在 copyBytes 部分引发错误。尽管我已经看到了一些解决方案,例如在参数中传递地址,但我不想冒险破坏代码的其余部分。有什么建议吗?
原来的代码是错误的。UInt8(value)
生成一个新的、不可变的值,您无法写入该值。我认为旧的编译器只是让你逃脱它,但它从来都是不正确的。
他们的意思是写入预期的类型,然后在最后转换类型。
extension Data {
func int8Value() -> Int8 {
var value: UInt8 = 0
copyBytes(to: &value, count: MemoryLayout<UInt8>.size)
return Int8(value)
}
}
也就是说,我今天不会那样做。Data
会自动将其值强制转换为您想要的任何类型,因此这种方式更安全、更简单且非常通用:
extension Data {
func int8ValueOfFirstByte() -> Int8 {
return withUnsafeBytes{ return $0.pointee }
}
}
或者这样,这是特定于整数的(甚至更简单):
extension Data {
func int8Value() -> Int8 {
return Int8(bitPattern: self[0])
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)