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

时间:2017-01-14 17:44:19

标签: bluetooth swift3 nsdata

我分叉了这个项目,所以我对所有细节都不熟悉: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
}

enter image description here

然而,它出现在Swift 3中,现在这会在copyBytes部分引发错误。虽然我已经看到一些解决方案,例如在参数中传递地址,但我不想冒险破坏代码的其余部分。关于如何做的任何建议?

1 个答案:

答案 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