导致“无法将不可变作为 inout 传递”的 Swift 3 转换 [重复]

Posted

技术标签:

【中文标题】导致“无法将不可变作为 inout 传递”的 Swift 3 转换 [重复]【英文标题】:Swift 3 Conversion that results in "Cannot pass immutable as inout" [duplicate] 【发布时间】:2016-12-13 17:02:01 【问题描述】:

我是一个完整的 Swift 新手,但我正在使用 swift 为 BLE 编写应用程序并且遇到了问题。我正在研究我发现的一些开源代码,以了解如何构建 ios 应用程序并与 BLE 通信,当我将其转换为 Swift 3 时,出现了许多错误。

代码:

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

错误:

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

我一直在网上寻找解决方案,发现如下:

NSData to [Uint8] in Swift CBCharacteristic value in swift3

我尝试实现这些,查看以下代码行:

if let data = characteristic.value 
   var bytes = Array(repeating: 0 as UInt8,count:someData.count/MemoryLayout<UInt8>.size)
   data.copyBytes(to: &bytes, count:data.count)

let data = "foo".data(using: .utf8)!
let array = [UInt8](data)
let array = data.withUnsafeBytes 
    [UInt8](UnsafeBufferPointer(start: $0, count: data.count))

除了一些常见变量之外,我不太了解它们之间的相关性。有人可以解释 CopyBytes 函数内部发生了什么(“to”和“count”在做什么),错误来自什么,以及我一直在查看的示例是否与我的方法有关我想解决?

【问题讨论】:

@Martin R 我很困惑,为什么在我的问题一个月后有人问另一个问题时,你将我的问题标记为重复......? 重复的时间顺序不相关。用户通常选择具有最佳答案的问题作为“主”问题。将您的问题标记为重复问题不会受到任何处罚,因此不必担心。 哦好的知道了,谢谢@CodyGray 【参考方案1】:

Int8UInt8 的类型转换似乎存在问题,并采用了生成的UInt8 转换的地址。强制转换的结果是一个不可变的值,其内存位置不能作为函数参数传递。如果您只是将变量初始化为无符号整数,它应该可以很好地传递地址。

以下代码应该可以工作:

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

【讨论】:

请注意,如果 value 超出范围 0...127,Int8(value) 在运行时会崩溃。比较***.com/a/41653097/1187415。

以上是关于导致“无法将不可变作为 inout 传递”的 Swift 3 转换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

STM32被禁用SW口导致程序下载不了问题

STM32被禁用SW口导致程序下载不了问题

STM32被禁用SW口导致程序下载不了问题

STM32被禁用SW口导致程序下载不了问题

生成树协议(STP)与MSTP

STP(生成树协议)原理及实例配置