UnsafeMutableRawPointer から UnsafeMutablePointer<T> にキャストする方法


UnsafeMutableRawPointer から UnsafeMutablePointer<T> にキャストする方法をずっと悩んでいましたが、やっとわかったので、ここにメモしておきます。

わざとらしいコードですが、一旦 UnsafeMutableRawPointer にしたポインタを UnsafeMutablePointer<T> にキャストして、pointee を更新する事で、オリジナルも更新された事がわかります。Playground でも動作します。

// Swift 3.0 - Playground Ready
struct Context {
    var city = "Tokyo"
}

var context: Context = Context()
let rawPtr = UnsafeMutableRawPointer(&context)
let opaquePtr = OpaquePointer(rawPtr)
let contextPtr = UnsafeMutablePointer<Context>(opaquePtr)

context.city // "Tokyo"
contextPtr.pointee.city = "New York"
context.city // "New York"