Swift 数组作为 C 函数缓冲区
Swift array as c function buffer
我正在使用 swift 数组作为函数的输出缓冲区,该函数采用指针并填充它,如下所示:
var buffer : [Int32] = ...
tehFillFunc(UnsafeMutablePointer<Int32>(buffer))
这工作正常,问题是编译器抱怨 Variable 'buffer' was never mutated; consider changing to 'let' constant
,我不想这样做,因为我很确定它在我的填充函数中发生了变异。
那么,有没有办法让它静音呢? (我可以做一些虚拟设置,但我更愿意正确地做)。
编辑:按要求显示问题的完整示例代码(甚至不需要 c):
class ViewController: UIViewController {
func fill(sth: UnsafeMutablePointer<Int32>) {
sth[0] = 7
}
override func viewDidLoad() {
super.viewDidLoad()
var array = [Int32].init(count: 10, repeatedValue: 0)
fill(UnsafeMutablePointer<Int32>(array))
print("\(array)")
}
}
但是,解决方案已经发布。最简单的形式:
fill(&array)
通常您需要指定缓冲区大小。在这种情况下,我更喜欢以下解决方案:
let bufferSize = 1000
var buffer = [Int32](count: bufferSize, repeatedValue: 0)
tehFillFunc(&buffer)
Array
上有一个用于此目的的方法:
var buffer : [Int32] = ...
buffer.withUnsafeMutableBufferPointer {
tehFillFunc([=10=].baseAddress)
}
我确保数组至少在 withUnsafeMutableBufferPointer
returns 之前仍然存在。因为它需要一个 inout
参数,所以缓冲区必须是 var
.
我正在使用 swift 数组作为函数的输出缓冲区,该函数采用指针并填充它,如下所示:
var buffer : [Int32] = ...
tehFillFunc(UnsafeMutablePointer<Int32>(buffer))
这工作正常,问题是编译器抱怨 Variable 'buffer' was never mutated; consider changing to 'let' constant
,我不想这样做,因为我很确定它在我的填充函数中发生了变异。
那么,有没有办法让它静音呢? (我可以做一些虚拟设置,但我更愿意正确地做)。
编辑:按要求显示问题的完整示例代码(甚至不需要 c):
class ViewController: UIViewController {
func fill(sth: UnsafeMutablePointer<Int32>) {
sth[0] = 7
}
override func viewDidLoad() {
super.viewDidLoad()
var array = [Int32].init(count: 10, repeatedValue: 0)
fill(UnsafeMutablePointer<Int32>(array))
print("\(array)")
}
}
但是,解决方案已经发布。最简单的形式:
fill(&array)
通常您需要指定缓冲区大小。在这种情况下,我更喜欢以下解决方案:
let bufferSize = 1000
var buffer = [Int32](count: bufferSize, repeatedValue: 0)
tehFillFunc(&buffer)
Array
上有一个用于此目的的方法:
var buffer : [Int32] = ...
buffer.withUnsafeMutableBufferPointer {
tehFillFunc([=10=].baseAddress)
}
我确保数组至少在 withUnsafeMutableBufferPointer
returns 之前仍然存在。因为它需要一个 inout
参数,所以缓冲区必须是 var
.