14

Swift構造体のアドレスをvoid UnsafeMutablePointerにキャストする方法はありますか?
私は成功せずにこれを試しました:

struct TheStruct {
    var a:Int = 0
}

var myStruct = TheStruct()
var address = UnsafeMutablePointer<Void>(&myStruct)

ありがとう!

編集:
私が実際に Swift に移植しようとしているコンテキストは、 Learning CoreAudioの最初の例です。
これは私が今までやってきたことです:

func myAQInputCallback(inUserData:UnsafeMutablePointer<Void>,
    inQueue:AudioQueueRef,
    inBuffer:AudioQueueBufferRef,
    inStartTime:UnsafePointer<AudioTimeStamp>,
    inNumPackets:UInt32,
    inPacketDesc:UnsafePointer<AudioStreamPacketDescription>)
 { }

struct MyRecorder {
    var recordFile:     AudioFileID = AudioFileID()
    var recordPacket:   Int64       = 0
    var running:        Boolean     = 0
}

var queue:AudioQueueRef = AudioQueueRef()
AudioQueueNewInput(&asbd,
    myAQInputCallback,
    &recorder,  // <- this is where I *think* a void pointer is demanded
    nil,
    nil,
    UInt32(0),
    &queue)

私は Swift にとどまる努力をしていますが、これが利点よりも問題であることが判明した場合は、C 関数にリンクすることになります。

編集: 下の行
Swift で CoreAudio の AudioQueue を使用しようとしているためにこの質問にたどり着いた場合は、使用しないでください。(詳しくはコメントを読んでください)

4

2 に答える 2

19

私の知る限り、最短の方法は次のとおりです。

var myStruct = TheStruct()
var address = withUnsafeMutablePointer(&myStruct) {UnsafeMutablePointer<Void>($0)}

しかし、なぜこれが必要なのですか?それをパラメーターとして渡したい場合は、次のことができます(そしてすべきです):

func foo(arg:UnsafeMutablePointer<Void>) {
    //...
}

var myStruct = TheStruct()
foo(&myStruct)
于 2015-04-10T09:31:57.487 に答える
1

Swift が何年にもわたって進化するにつれて、ほとんどのメソッド プロトタイプが変更されました。Swift 5の構文は次のとおりです。

var struct = TheStruct()

var unsafeMutablePtrToStruct = withUnsafeMutablePointer(to: &struct) {
    $0.withMemoryRebound(to: TheStruct.self, capacity: 1) {
        (unsafePointer: UnsafeMutablePointer<TheStruct>) in

        unsafePointer
    }
}
于 2020-03-31T14:45:26.700 に答える