文書   >   Swift   >   Swift 標準ライブラリ  >     手動でメモリ管理   >   ポインタパラメータで関数を呼び出す


記事


Calling Functions With Pointer Parameters (ポインタパラメータで関数を呼び出す)


ポインタをパラメータとして取る関数を呼び出すときは、暗黙のポインタキャストまたはブリッジングを使用してください。





概要


ポインタをパラメータとして取る関数を呼び出すときには、暗黙的キャストを使用して互換性のあるポインタ型を渡すか、暗黙的ブリッジングを使用してポインタを変数または配列の内容に渡すことができます。


定数ポインタをパラメータとして渡す


UnsafePointer<Type> 引数を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。


関数に渡すポインタは、関数呼び出しの間だけ有効であることが保証されています。関数が戻った後は、ポインタをずっと持ち続けたりアクセスしないでください。


この例は、定数ポインタをとる関数を呼び出せるさまざまな方法を示しています。


func takesAPointer(_ p: UnsafePointer<Float>) {
    // ...
}

var x: Float = 0.0
takesAPointer(&x)
takesAPointer([1.0, 2.0, 3.0])


UnsafeRawPointer 引数を取る関数を呼び出すときには、UnsafePointer<Type> と同じオペランドを渡すことができますが、任意の型を Type として渡すことができます。


この例は、定数の生のポインタを取る関数を呼び出すことができるさまざまな方法を示しています。


func takesARawPointer(_ p: UnsafeRawPointer?)  {
    // ...
}

var x: Float = 0.0, y: Int = 0
takesARawPointer(&x)
takesARawPointer(&y)
takesARawPointer([1.0, 2.0, 3.0] as [Float])
let intArray = [1, 2, 3]
takesARawPointer(intArray)
takesARawPointer("How are you today?")


可変 (Mutable) ポインタをパラメータとして渡す


UnsafeMutablePointer<Type> 引数を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。


この例は、可変ポインタを取る関数を呼び出すことができるさまざまな方法を示しています。


func takesAMutablePointer(_ p: UnsafeMutablePointer<Float>) {
    // ...
}

var x: Float = 0.0
var a: [Float] = [1.0, 2.0, 3.0]
takesAMutablePointer(&x)
takesAMutablePointer(&a)


UnsafeMutableRawPointer 引数を取ると宣言されている関数を呼び出すときは、UnsafeMutablePointer<Type> と同じオペランドを渡すことができますが、Type として任意の型を使用できます。


この例は、可変の生ポインタを取る関数を呼び出すことができるさまざまな方法を示しています。


func takesAMutableRawPointer(_ p: UnsafeMutableRawPointer?)  {
    // ...
}

var x: Float = 0.0, y: Int = 0
var a: [Float] = [1.0, 2.0, 3.0], b: [Int] = [1, 2, 3]
takesAMutableRawPointer(&x)
takesAMutableRawPointer(&y)
takesAMutableRawPointer(&a)
takesAMutableRawPointer(&b)


自動解放ポインタをパラメータとして渡す


AutoreleasingUnsafeMutablePointer<Type> を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。


他のポインタ型とは異なり、暗黙的にブリッジされたパラメータとして配列を使用することはできません。


関数ポインタをパラメータとして渡す


C の関数ポインタ引数を取る関数を呼び出すときには、最上位の Swift 関数、クロージャリテラル、@convention(c) 属性で宣言されたクロージャ、または nil を渡すことができます。汎用型のパラメータがクロージャ引数リストまたは本体で参照されていない限り、汎用型または汎用メソッドのクロージャプロパティを渡すこともできます。


たとえば、Core FoundationCFArrayCreateMutable(_:_:_:) 関数を考えてみましょう。CFArrayCreateMutable(_:_:_:) 関数は、関数ポインタコールバックで初期化される CFArrayCallBacks 構造体を取ります。


func customCopyDescription(_ p: UnsafeRawPointer?) -> Unmanaged<CFString>? {
    // return an Unmanaged<CFString>? value
}
 
var callbacks = CFArrayCallBacks(
    version: 0,
    retain: nil,
    release: nil,
    copyDescription: customCopyDescription,
    equal: { (p1, p2) -> DarwinBoolean in
        // return Bool value
    }
)
var mutableArray = CFArrayCreateMutable(nil, 0, &callbacks)


この例では、CFArrayCallBacks イニシャライザは、retain および release パラメータの引数として nil 値を使用し、customCopyDescription パラメータの引数として customCopyDescription(_:) 関数を、また equal パラメータの引数としてクロージャリテラルを使用しています。


注意:

関数ポインタ引数に使用できるのは、C 関数参照呼び出し規約を持つ Swift 関数型だけです。C 関数ポインタと同様に、@convention(c) 属性を持つ Swift 関数型は、その周囲のスコープの内容をキャプチャしません。


















トップへ












トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

  • 言語:Swift
  • 概要












  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ