入れ子にされたクロージャで取り込まれた値を使用するための適切な構文は何ですか?入れ子になったクロージャでの値の取り込み
zlib
ライブラリを使用して、整数値からCRC32を計算するための次の作業コードがあります。
func testCrc()
{
var x: UInt32 = 0xffffffff
let result = withUnsafePointer(to: &x, {
$0.withMemoryRebound(to: Bytef.self, capacity: 4) {
crc32(0, $0, 4)
}
})
XCTAssertEqual(0xffffffff, result)
}
任意の値からCRC32を計算できるスタンドアロン汎用関数を作成したいと考えています。これを行うためには、値そのもののほかに、サイズを計算して渡す必要があるので、上記のコードで使用したように、明示的なサイズを使用することはできません - 4 -
しかし、計算されたサイズを内部クロージャに渡す正しい構文を見つけるのに問題があります。上記のコード
func calculateCrc32<T>(_ crc: UInt, value: inout T) -> UInt
{
let size = MemoryLayout.size(ofValue: value)
let result = withUnsafePointer(to: &value, {
$0.withMemoryRebound(to: Bytef.self, capacity: size) {
crc32(crc, $0, size) // error
}
})
return result
}
パラメータ$0
ため、むしろ混乱コンパイラのエラーを示しています。
が期待 引数の型に型 'UnsafeMutablePointer < _>' の値を変換できません 'UnsafePointer!'
私はcrc32(crc, $0, 4)
でcrc32(crc, $0, size)
を交換する場合、コンパイラが文句を言っていないと機能は4バイトのサイズと値のために適切に動作するため、紛らわしいです。
上記の問題を解決するにはどうすればよいですか?
ありがとう:
は、私はまた、それが簡単に 関数を呼び出すことが可能値
inout
パラメータを使用しての代わりに 、ローカル変数のコピーを作成することをお勧め。単純なエラーは最悪です。 –