UnsafePointer no longer works in swift 3

徘徊边缘 提交于 2020-12-08 07:05:21

问题


After I convert from swift 2 to swift 3, there is an error pop up for the below metioned line

let value = UnsafePointer<UInt32>(array1).pointee

'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type.

in swift2 it is like

let value = UnsafePointer<UInt32>(array1).memory

Can someone explain please? Sorry I'm quite new to swift3

After i have make the changes to

let abc = UnsafePointer<UInt32>(array1).withMemoryRebound(to: <#T##T.Type#>, capacity: <#T##Int#>, <#T##body: (UnsafeMutablePointer<T>) throws -> Result##(UnsafeMutablePointer<T>) throws -> Result#>)

but still what value should go in to the variable? Sorry, i have search around but too bad i can't find a solution


回答1:


You can try this:

let rawPointer = UnsafeRawPointer(array1)
let pointer = rawPointer.assumingMemoryBound(to: UInt32.self)
let value = pointer.pointee

Raw pointer is a pointer for accessing untype data.

assumingMemoryBound(to:) can convert from an UnsafeRawPointer to UnsafePointer<T>.

Reference :Swift 3.0 Unsafe World




回答2:


If array is an Array, your best bet is to use withUnsafeBufferPointer:

array.withUnsafeBufferPointer { buffer in
    // do something with 'buffer'
    // (if you need an UnsafePointer rather than an UnsafeBufferPointer,
    // you can access that via the buffer's .baseAddress property)
}

Make sure you don't let the buffer pointer escape from the closure, because it will not be valid outside it.



来源:https://stackoverflow.com/questions/39824340/unsafepointer-no-longer-works-in-swift-3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!