在嵌套闭包中捕获值

Dal*_*kar 5 closures swift swift3

在嵌套闭包中使用捕获的值的正确语法是什么?

我有以下工作代码用于使用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)
}
Run Code Online (Sandbox Code Playgroud)

我想创建可以从任何值计算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
}
Run Code Online (Sandbox Code Playgroud)

上面的代码显示了相当混乱的参数编译器错误$0

无法将类型“ UnsafeMutablePointer <_>”的值转换为预期的参数类型“ UnsafePointer!”。

令人困惑,因为如果我替换crc32(crc, $0, size)crc32(crc, $0, 4)编译器,则不会抱怨,并且函数对于4字节大小的值正常工作。

如何解决以上问题?