首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法将不可变值作为inout参数传递:函数调用返回不可变值

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

Stack Overflow用户
提问于 2017-01-15 01:44:19
回答 1查看 862关注 0票数 0

我创建了这个项目,所以我不熟悉所有的细节:https://github.com/nebs/hello-bluetooth/blob/master/HelloBluetooth/NSData%2BInt8.swift

这都是我用来向Arduino发送8位值的NSData扩展的一部分。

代码语言:javascript
运行
复制
func int8Value() -> Int8 {
    var value: Int8 = 0
    copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size)    //BUG

    return value
}

然而,在Swift 3中,这现在在copyBytes部分抛出了一个错误。虽然我已经看到了一些解决方案,例如在参数中传递地址,但我不想冒险破坏代码的其余部分。对此有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-15 01:50:42

原始代码不正确。UInt8(value)会生成一个新的、不能写入的不可变值。我认为旧的编译器只是让你摆脱它,但它从来都不是正确的。

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

代码语言:javascript
运行
复制
extension Data {
    func int8Value() -> Int8 {
        var value: UInt8 = 0
        copyBytes(to: &value, count: MemoryLayout<UInt8>.size)

        return Int8(value)
    }
}

也就是说,我今天不会这么做。Data会自动将其值强制转换为您想要的任何类型,因此这种方式更安全、更简单且非常通用:

代码语言:javascript
运行
复制
extension Data {
    func int8ValueOfFirstByte() -> Int8 {
        return withUnsafeBytes{ return $0.pointee }
    }
}

或者这样,这是特定于int的(甚至更简单):

代码语言:javascript
运行
复制
extension Data {
    func int8Value() -> Int8 {
        return Int8(bitPattern: self[0])
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41653043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档