UnsafeMutableRawPointer
から UnsafeMutablePointer<T>
にキャストする方法をずっと悩んでいましたが、やっとわかったので、ここにメモしておきます。
わざとらしいコードですが、一旦 UnsafeMutableRawPointer
にしたポインタを UnsafeMutablePointer<T>
にキャストして、pointee
を更新する事で、オリジナルも更新された事がわかります。Playground でも動作します。
.swift
// 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"