Karakuri.com

ベンチャー企業で働くソフトウェアエンジニアの技術録

SwiftでObjective-Cのポインタ型を書き換えるときのUnsafeMutablePointer<T>について

スポンサーリンク

とあるSDKを使ってiOSアプリを開発しているのですが、いただいたSDKのドキュメントに書かれているサンプルコードがObjective-Cでした。僕はObjective-Cは嫌いなのでSwiftに書き換えます。するとこんな関数がありました。

(id)method:(int*)arg;

Int型のポインタです。Swiftにはない概念ですね。これどうやってSwiftから呼び出せばいいんでしょうか。

Xcodeのエラーを見てみる

とりあえずこう書いてみます。

let value = 1
method(value)

当然エラーとなります。XcodeはUnsafeMutablePointer<Int>を使えとか言ってきます。なんじゃそりゃ。
UnsafeMutablePointer - Swift Standard Library | Apple Developer Documentation

結論からいうと&をつけるだけで良い

UnsafeMutablePointer<Int>型の変数を定義して1を代入して関数に渡さないといけないのか?と思って色々やっていたのですが、上手くいかず。公式リファレンスも読みながら最終的に&をつけるだけで良いことが分かりました笑。

let value = 1
method(&value)

UnsafeMutablePointer<T>はSwiftでポインタを扱うもの

Swiftでポインタを扱うのはナンセンスなので深く調べていないのですが、簡潔に言うとUnsafeMutablePointer<T>はSwiftでポインタを扱い操作するブリッジとして機能する型のようです。リンクは失念したのですが、Apple Developerに下記のようなコードがあって感覚は掴めました。

func method1() {
     let value = 1
     method2(&value)
}

func method2(UnsafeMutablePointer<Int> value) {
     .....
}

できればSwiftでポインターは触りたくないですなー。