読者です 読者をやめる 読者になる 読者になる

What we talk about when we talk about Technology

技術について語ります。

Swiftのクラス⇄UnsafeMutablePointer<Void>

CoreAudio

C言語APIを触っていると、UnsafeMutablePointerにselfを入れたりすることがあって、 これどうするんだ。。。となることがある。 そんなときは以下のメソッドでブリッジしてあげる。

func bridge<T: AnyObject>(obj: T) -> UnsafeMutablePointer<Void> {
    return UnsafeMutablePointer(Unmanaged.passUnretained(obj).toOpaque())
}

func bridge<T: AnyObject>(ptr: UnsafeMutablePointer<Void>) -> T {
    return Unmanaged<T>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
}


// object → pointer
var callbackStruct = AURenderCallbackStruct(
            inputProc: renderCallback,
            inputProcRefCon: bridge(self)
        )

// pointer → object
let def: RemoteOutput = bridge(inRefCon)

参考

How to cast self to UnsafeMutablePointer type in swift