値を設定する前にinitializeで初期化を行っておく。
これをしておかないと、deainitializeを呼び出したりした際にクラッシュする。
一応、
deinitializeメソッドのリファレンスでもinitializedされている必要があると記載がありますが、確実にクラッシュするわけではないので注意です。
main.swift
import libfoo
let fooPointer = UnsafeMutablePointer<Foo>.allocate(capacity: 1)
// 値を受け取る前にinitializeメソッドで初期化を行っておく
fooPointer.initialize(to: Foo())
// 値を受け取る
setFoo(fooPointer)
コメントにて、
@t-ae さんからUnsafeMutablePointer<T>ではなく、以下でも値を受け取ることができるとご教示頂きました。
main2.swift
var foo = Foo()
setFoo(&foo)
上記のコードは、UnsafeMutablePointer<T>版の糖衣構文になっていますので、
initializeはまさにfoo変数宣言時に必要な初期化(var foo = Foo())であると考えられます。
一応C側のコードは以下のようなのを想定
foo.h
typedef struct {
char* name;
int age;
} Foo;
void setFoo(Foo* foo);
foo.c
void setFoo(Foo* foo) {
foo->name = "tanaka";
foo->age = 10
}