1

次のように、ポインターを取り、それを埋める関数の出力バッファーとして迅速な配列を使用しています。

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)
4

2 に答える 2

2

通常、バッファ サイズを指定する必要があります。そしてこの場合、私は次の解決策を好みます:

let bufferSize = 1000
var buffer = [Int32](count: bufferSize, repeatedValue: 0)
tehFillFunc(&buffer)
于 2016-06-14T10:31:39.177 に答える
1

Arrayこの目的のための方法があります:

var buffer : [Int32] = ...

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

少なくともwithUnsafeMutableBufferPointer戻るまで、配列が生きていることを確認します。inoutパラメータを取るため、バッファはvar.

于 2016-06-14T10:32:06.430 に答える