我分叉了这个项目,所以我对所有细节都不熟悉: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部分引发错误。虽然我已经看到一些解决方案,例如在参数中传递地址,但我不想冒险破坏代码的其余部分。关于如何做的任何建议?
答案 0 :(得分:3)
原始代码不正确。 Data
生成一个新的,不可变的值,您无法写入。我假设旧的编译器只是让你逃脱它,但它永远不会正确。
他们打算做的是写入预期的类型,然后在最后转换类型。
extension Data {
func int8ValueOfFirstByte() -> Int8 {
return withUnsafeBytes{ return $0.pointee }
}
}
那就是说,今天我不会这样做。 extension Data {
func int8Value() -> Int8 {
return Int8(bitPattern: self[0])
}
}
会将其值强制转换为您想要的任何类型,因此这种方式更安全,更简单,更通用:
_forwardParentProp
或者这样,特定于整数(甚至更简单):
_forwardParentPath