我只是想快速了解闭包。
我想使用数组的 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/