Swift 3 次转换导致 "Cannot pass immutable as inout"
Swift 3 Conversion that results in "Cannot pass immutable as inout"
我是一个完整的 Swift 新手,但我正在使用 swift 为 BLE 编写应用程序并且 运行 遇到了问题。我正在处理我发现的一些开源代码,以了解如何构建 iOS 应用程序并与 BLE 通信,当我将其转换为 Swift 3 时,出现了一些错误向上。
代码:
func int8Value() -> Int8 {
var value: Int8 = 0
copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size)
return value
}
错误:
Cannot pass immutable value as inout argument: function call returns immutable value
我一直在网上寻找解决方案并找到了以下内容:
- NSData to [Uint8] in Swift
我尝试实现这些,查看以下代码行:
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: [=14=], count: data.count))
}
除了几个共同变量外,我不太了解它们之间的相关性。有人可以解释 CopyBytes 函数内部发生了什么("to" 和 "count" 正在做什么),错误来自什么,以及我一直在看的例子是否与我要修复的方法?
从 Int8
到 UInt8
的类型转换以及获取结果 UInt8
转换的地址似乎存在问题。转换的结果是一个不可变值,其内存位置不能作为函数参数传递。如果您只是将变量初始化为无符号整数,它应该可以很好地传递地址。
以下代码应该有效:
func int8Value() -> Int8 {
var value: UInt8 = 0
copyBytes(to: &value, count: MemoryLayout<Int8>.size)
return Int8(value)
}
我是一个完整的 Swift 新手,但我正在使用 swift 为 BLE 编写应用程序并且 运行 遇到了问题。我正在处理我发现的一些开源代码,以了解如何构建 iOS 应用程序并与 BLE 通信,当我将其转换为 Swift 3 时,出现了一些错误向上。
代码:
func int8Value() -> Int8 {
var value: Int8 = 0
copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size)
return value
}
错误:
Cannot pass immutable value as inout argument: function call returns immutable value
我一直在网上寻找解决方案并找到了以下内容:
- NSData to [Uint8] in Swift
我尝试实现这些,查看以下代码行:
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: [=14=], count: data.count))
}
除了几个共同变量外,我不太了解它们之间的相关性。有人可以解释 CopyBytes 函数内部发生了什么("to" 和 "count" 正在做什么),错误来自什么,以及我一直在看的例子是否与我要修复的方法?
从 Int8
到 UInt8
的类型转换以及获取结果 UInt8
转换的地址似乎存在问题。转换的结果是一个不可变值,其内存位置不能作为函数参数传递。如果您只是将变量初始化为无符号整数,它应该可以很好地传递地址。
以下代码应该有效:
func int8Value() -> Int8 {
var value: UInt8 = 0
copyBytes(to: &value, count: MemoryLayout<Int8>.size)
return Int8(value)
}