Bluetooth 无法将不可变值作为inout参数传递:函数调用返回不可变值

Bluetooth 无法将不可变值作为inout参数传递:函数调用返回不可变值,bluetooth,swift3,nsdata,Bluetooth,Swift3,Nsdata,我参与了这个项目,所以我不太熟悉所有的细节: 这都是NSData扩展的一部分,我正在使用它向Arduino发送8位值 func int8Value() -> Int8 { var value: Int8 = 0 copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size) //BUG return value } func int8Value()->Int8{ 变量值:Int8

我参与了这个项目,所以我不太熟悉所有的细节:

这都是NSData扩展的一部分,我正在使用它向Arduino发送8位值

func int8Value() -> Int8 {
    var value: Int8 = 0
    copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size)    //BUG

    return value
}
func int8Value()->Int8{
变量值:Int8=0
copyBytes(to:&UInt8(值),count:MemoryLayout.size)//错误
返回值
}


但是,在Swift 3中显示,这会在copyBytes部分引发错误。虽然我看到了一些解决方案,比如在参数中传递地址,但我不想冒险破坏代码的其余部分。有什么建议吗?

原始代码不正确
UInt8(value)
生成一个新的、不可变的值,您无法写入该值。我想旧的编译器只是让你逍遥法外,但它从来都不正确

他们要做的是写入预期的类型,然后在最后转换该类型

extension Data {
    func int8Value() -> Int8 {
        var value: UInt8 = 0
        copyBytes(to: &value, count: MemoryLayout<UInt8>.size)

        return Int8(value)
    }
}
或者这种方式,这是特定于int的(甚至更简单):


原始代码不正确
UInt8(value)
生成一个新的、不可变的值,您无法写入该值。我想旧的编译器只是让你逍遥法外,但它从来都不正确

他们要做的是写入预期的类型,然后在最后转换该类型

extension Data {
    func int8Value() -> Int8 {
        var value: UInt8 = 0
        copyBytes(to: &value, count: MemoryLayout<UInt8>.size)

        return Int8(value)
    }
}
或者这种方式,这是特定于int的(甚至更简单):


真棒的解释!非常感谢你!您打算在第一个和最后一个示例中使用
Int8
init(位模式:)
初始化器,对吗?我没有,但您是正确的。我写的方式会崩溃。谢谢。我是代码的原始作者,感谢您指出错误并提供解决方案!我将更新原始回购协议以反映这一点。很棒的解释!非常感谢你!您打算在第一个和最后一个示例中使用
Int8
init(位模式:)
初始化器,对吗?我没有,但您是正确的。我写的方式会崩溃。谢谢。我是代码的原始作者,感谢您指出错误并提供解决方案!我将更新原始回购协议以反映这一点。
extension Data {
    func int8Value() -> Int8 {
        return Int8(bitPattern: self[0])
    }
}