我创建了这个项目,所以我不熟悉所有的细节:https://github.com/nebs/hello-bluetooth/blob/master/HelloBluetooth/NSData%2BInt8.swift。
这都是我用来向Arduino发送8位值的NSData扩展的一部分。
func int8Value() -> Int8 {
var value: Int8 = 0
copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size) //BUG
return value
}
然而,在Swift 3中,这现在在copyBytes部分抛出了一个错误。虽然我已经看到了一些解决方案,例如在参数中传递地址,但我不想冒险破坏代码的其余部分。对此有什么建议吗?
发布于 2017-01-15 01:50:42
原始代码不正确。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 }
}
}
或者这样,这是特定于int的(甚至更简单):
extension Data {
func int8Value() -> Int8 {
return Int8(bitPattern: self[0])
}
}
https://stackoverflow.com/questions/41653043
复制相似问题