- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在嵌套闭包中使用捕获值的正确语法是什么?
我有以下使用 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
的相当困惑的编译器错误:
Cannot convert value of type 'UnsafeMutablePointer<_>' to expected argument type 'UnsafePointer!'
令人困惑,因为如果我将 crc32(crc, $0, size)
替换为 crc32(crc, $0, 4)
,编译器不会报错并且函数可以正确处理值大小为 4 个字节。
如何解决上述问题?
最佳答案
错误信息具有误导性。你的代码几乎是正确的,“唯一”的问题是 crc32()
的最后一个参数需要是一个 uInt
:
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, uInt(size))
}
})
return result
}
如果调用 crc32(crc, $0, 4)
那么“整数文字” 4
作为最后一个参数传递,编译器推断它的类型作为 uInt
来匹配函数定义。
它不会用 crc32(crc, $0, size)
编译,因为 Swift 会不会在类型之间隐式转换。
或者,使用 numericCast()
,这是一个通用函数,可以在不同的有符号和无符号整数类型之间进行转换(并在溢出时进行陷阱)。
我还建议制作该值的局部变量副本使用 inout
参数,这使得调用功能:
func calculateCrc32<T>(_ crc: UInt, value: T) -> UInt {
var value = value
let size = MemoryLayout.size(ofValue: value)
let result = withUnsafePointer(to: &value, {
$0.withMemoryRebound(to: Bytef.self, capacity: size) {
crc32(crc, $0, numericCast(size))
}
})
return result
}
关于swift - 在嵌套闭包中捕获值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917697/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!