51

次のコードを呼び出すときに、「自己」を迅速にC関数に渡そうとしています:

var callbackStruct : AURenderCallbackStruct = 
    AURenderCallbackStruct.init(
      inputProc: recordingCallback,
      inputProcRefCon: UnsafeMutablePointer<Void>
    )

ここで「自己」を UnsafeMutablePointer 型にキャストする理想的な方法は何ですか?

4

4 に答える 4

4

これはwithUnsafeMutablePointer、任意の Swift ポインターを C ポインターに変換するためのもののようです。したがって、おそらくこれを行うことができます(私は試していませんが、テストしたコードは安全に動作します):

var mself = self 
withUnsafeMutablePointer(&mself) { v in
    let v2 = UnsafeMutablePointer<Void>(v)
    myStruct.inputProcRefCon = v2
}
于 2015-10-23T15:24:21.967 に答える
2
func bridge<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer(Unmanaged.passUnretained(obj).toOpaque())
}


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

func bridgeRetained<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer( Unmanaged.passRetained(obj).toOpaque())}

func bridgeTransfer<T : AnyObject>(ptr : UnsafePointer<Void>) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()}
于 2016-07-07T11:05:24.740 に答える
0

この回答は、 Martin R の回答ほどコールバックのトピック固有のものではありませんが、役立つ可能性があります...

&通常、演算子を使用して、安全でない void ポインターに任意の型の値を渡すことができます。

func baz(p: UnsafeMutablePointer<Void>) -> String {
    return "\(p)"
}

var num = 5
print(baz(&num))

ただし、渡すには、変更可能なselfコンテキストで渡す必要がありますself。つまりinit、参照型ではなく、値型の変更メソッド (または ) でこれを行う必要があります。

struct FooValue {
    mutating func bar() {
        print(baz(&self))
    }
}

var myFooValue = FooValue()
myFooValue.bar()

参照型を使用する場合は、参照のローカル コピーを作成し、それへのポインターを渡す必要があります。

class FooReference {
    func bar() {
        var localSelf = self
        print(baz(&localSelf))
    }
}

let myFooReference = FooReference()
myFooReference.bar()
于 2015-10-23T17:15:33.300 に答える