文書   >   Swift   >   Swift 標準ライブラリ  >     手動でメモリ管理   >   ポインタパラメータで関数を呼び出す
記事
Calling Functions With Pointer Parameters (ポインタパラメータで関数を呼び出す)
ポインタをパラメータとして取る関数を呼び出すときは、暗黙のポインタキャストまたはブリッジングを使用してください。
概要
ポインタをパラメータとして取る関数を呼び出すときには、暗黙的キャストを使用して互換性のあるポインタ型を渡すか、暗黙的ブリッジングを使用してポインタを変数または配列の内容に渡すことができます。
定数ポインタをパラメータとして渡す
UnsafePointer<Type> 引数を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。
- UnsafePointer<Type>,UnsafeMutablePointer<Type>、または AutoreleasingUnsafeMutablePointer<Type> 値。必要に応じてこれらは UnsafePointer<Type> に暗黙的にキャストされます。
- Type が Int8 または UInt8 の場合は、String 値。文字列 (string) はゼロで終了するバッファ内で自動的に UTF8 に変換され、そのバッファへのポインタが関数に渡されます。
- 左辺の識別子のアドレスへのポインタとして渡される、Type 型の可変変数、プロパティ、またはサブスクリプト参照を含む in-out 式。
- [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> 引数を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。
- UnsafeMutablePointer<Type> 値。
- 可変 (mutable) 値のアドレスへのポインタとして渡される、可変型の変数、プロパティ、またはサブスクリプト参照を含む Type 型の in-out 式。
- mutable の変数、プロパティ、またはサブスクリプトの参照を含む [Type] 型の in-out 式。配列の先頭へのポインタとして渡され、呼び出しの期間中に有効期間が延長されます。
この例は、可変ポインタを取る関数を呼び出すことができるさまざまな方法を示しています。
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> を取ると宣言されている関数を呼び出すときは、以下のいずれかを渡すことができます。
- AutoreleasingUnsafeMutablePointer<Type> 値。
- Type 型の mutable 変数、プロパティ、またはサブスクリプト参照を含む in-out 式。オペランドの値は、一時的に所有されていないバッファにビット単位でコピーされます。そのバッファのアドレスが呼び出し先に渡され、戻ったときにバッファ内の値はロードされ、保持され、そしてオペランドに再割り当てされます。
他のポインタ型とは異なり、暗黙的にブリッジされたパラメータとして配列を使用することはできません。
関数ポインタをパラメータとして渡す
C の関数ポインタ引数を取る関数を呼び出すときには、最上位の Swift 関数、クロージャリテラル、@convention(c) 属性で宣言されたクロージャ、または nil を渡すことができます。汎用型のパラメータがクロージャ引数リストまたは本体で参照されていない限り、汎用型または汎用メソッドのクロージャプロパティを渡すこともできます。
たとえば、Core Foundation の CFArrayCreateMutable(_:_:_:) 関数を考えてみましょう。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 関数型は、その周囲のスコープの内容をキャプチャしません。
トップへ
トップへ
トップへ
トップへ
トップへ