0

私はリンゴのドキュメントに従っていますが、残念ながら例はobjective-cで書かれていますが、Swift言語に自信があり、特にこの例では、いくつかの意味を理解できません:

void RunLoopSourcesPerformRoutine (void *info){
    RunLoopSource*  obj = (RunLoopSource*)info;
    [obj sourceFired];
}

この行:RunLoopSource* obj = (RunLoopSource*)info;

パラメータ:は void へのポインタvoid *infoであることを示しますinfo。その後、さまざまなアップル ドキュメントに従って、あらゆるタイプのデータ構造のアドレスを指定できます。この :void *infoを迅速な言語に変換すると、

info: UnsafeMutableRawPointer?

このRunLoopSource* obj = (RunLoopSource*)info;行は、obj が RunLoopSource 型の変数であり、これに の値が割り当てられていることを示していますが(RunLoopSource *) info、正確には、このステートメントは何を意味するのでしょうか? : (RunLoopSource *) info、そしてそれは迅速な言語でどのように翻訳されますか?

4

3 に答える 3

3

Swift はポインターが大嫌いです。これらの 2 行のコードは、次のように Swift に変換できます。

func RunLoopSourcesPerformRoutine(info: UnsafeMutableRawPointer) {
    let obj = info.assumingMemoryBound(to: RunLoopSource.self)
    obj.pointee.sourceFired()
}
于 2016-12-22T18:36:56.587 に答える
2

この特定の式は「タイプキャスト」です。infoこれは、不明なものへのポインター ( ) であると宣言されている が、void *実際にはプログラマーによって へのポインターであることがわかっていることを示していますRunLoopSource。これにより、式の型が強制的に変更され、 に割り当てられたときにコンパイラが満足するようになりobjます。

as!これはSwift での使用と同等であり、a のセマンティクスを知っvoid *ていても構文がそれを捉えていない場合に慣用的です。

(これはあなたの質問に述べられているように答えようとしますが、あなたがより多くの情報を探しているかどうかはわかりません。もしそうなら、明確にしてください。私または Swift の安全でないポインターの専門家が助けてくれます。)

于 2016-12-22T17:49:19.940 に答える