swift - swift 中的闭包和 withUnsafeBufferPointer()

标签 swift closures

我只是想快速了解闭包。

我想使用数组的 withUnsafeBufferPointer 方法。在最简单的形式中,我可以成功地做这样的事情:

var aa:[UInt8] = [1,2,3,4,5,6,7,8]
var bb = aa.withUnsafeBufferPointer({$0.baseAddress})

我也可以这样做:

var bb = aa.withUnsafeBufferPointer({pointerVal in pointerVal.baseAddress})

但是,我无法在不在 xcode 中生成错误的情况下执行此操作:

var bb = aa.withUnsafeBufferPointer({pointerVal in return pointerVal.baseAddress})

"Cannot convert the expression's type '((ST5)->(ST5)->ST4)->((ST5)->ST4)->ST4' to type 'R' 

在前两个赋值中,隐含了return 语句。如果我明确地把它放进去,事情就会失败。我无法将此与 Apple 的文档相协调。 (请参阅 The Swift Programming Language 中关于闭包的章节)。我想在其中放入一个更复杂的闭包,这需要一个 return 语句。我必须做什么才能做到这一点?

最佳答案

除非闭包只包含一个表达式,否则您需要指定参数和返回类型:

var bb = aa.withUnsafeBufferPointer({pointerVal -> UnsafePointer<UInt8> in return pointerVal.baseAddress})

或注释变量以便编译器可以推断类型:

var bb : UnsafePointer<UInt8> = aa.withUnsafeBufferPointer({pointerVal in return pointerVal.baseAddress})

但是你应该只在闭包内部使用指向数组缓冲区的指针。 像这样将指针存储在变量中是不安全的,因为数组可能 被释放,编译器不知道它是通过 bb 引用的。

关于swift - swift 中的闭包和 withUnsafeBufferPointer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760385/

相关文章:

swift - Definespresentationcontext 导致搜索器下的内容转移?

javascript - 理解 Jon Resig 的偏应用实现

JavaScript/node.js 从模型中获取数据

javascript - 闭包,for 循环

xcode - 从 swift 代码运行终端 "scan"命令

swift - ARKit相机初始位置?

gradle - 这个在 groovy 中看起来像闭包的代码是什么意思?

javascript - 使变量的行为类似于全局变量

swift - 查询嵌套数据如何工作?我还能检索下一级的数据吗?

swift - 我无法为我的 View 提供新的角半径