Swift数组作为c函数缓冲区

时间:2016-06-14 10:22:28

标签: arrays swift unsafemutablepointer

我正在使用swift数组作为输出缓冲区,用于获取指针并填充它的函数,如下所示:

var buffer : [Int32] = ...
tehFillFunc(UnsafeMutablePointer<Int32>(buffer))

这很好用,问题是编译器抱怨Variable 'buffer' was never mutated; consider changing to 'let' constant,我不想这样做,因为我很确定它在我的fill函数中被突变了。

那么,有没有办法让它沉默? (我可以做一些虚设,但我更愿意这样做。)

编辑:根据要求提供显示问题的完整示例代码(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)

2 个答案:

答案 0 :(得分:2)

通常您需要指定缓冲区大小。在这种情况下,我更喜欢以下解决方案:

let bufferSize = 1000
var buffer = [Int32](count: bufferSize, repeatedValue: 0)
tehFillFunc(&buffer)

答案 1 :(得分:1)

为此目的,Array上有一个方法:

var buffer : [Int32] = ...

buffer.withUnsafeMutableBufferPointer {
    tehFillFunc($0.baseAddress)
}

我确保数组至少存在,直到withUnsafeMutableBufferPointer返回。因为它需要inout参数,所以缓冲区必须是var