2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftでCのchar **をうまく扱う

Last updated at Posted at 2016-06-25

CとSwift両方大好きな皆様こんにちは。本稿では、Swiftでchar **をうまく扱う方法について考えてみます。

確かにSwiftでのchar *の取り扱いは悪くない

先駆者の方々の指摘通り、SwiftのString型とCのchar *型との相互変換はそれなりに整備されていると言えそうです。

String#withCStringString#fromCStringあたりを知っていればSwiftからCのシステムコール・ライブラリコールを便利に利用できるはずです。

ところでchar **は…?

ところで、Cのシステムコール・ライブラリコールにはchar **を引数に取るものがあり、Swiftからも利用できます。たとえばSwiftのposix_spawnの第5引数argvの型は次のようなものです。

UnsafePointer<UnsafeMutablePointer<Int8>>>

これはCで言うとchar *const *に対応しますが、これを[Stirng]とを相互変換したいときにどうすればいいのか、というのはあまり議論されていないように思います。途方に暮れた末、筆者はGistに落ちていたCStringArrayクラスを改造して使うことにしました。

CStringArray

今回利用したCStringArrayクラスはCocoa Touch Frameworkとして作成しており、Carthageでインストールすることができます。

CStringArrayはコンストラクタ引数に[String?]を取り、メンバ変数pointerschar *const *が取り出せます。下記は使用例です。

let argv = CStringArray(["/bin/ls", "-la" , "/", nil])
posix_spawn(&pid, argv.pointers[0], &action, nil, argv.pointers, nil)

pointersUnsafeMutablePointer<CChar>の配列なので、必要であればcountで個数も取り出せます。

&argv.pointersとすればchar **と互換になりますが、実装上pointersを書き換えられるとメモリリークしてしまうのでchar *const *で取り扱うのが無難だと思います。

参考URL

ご意見募集

実はこんなゴテゴテしたクラスを作らなくても綺麗に解決できるのかもしれません。Swift初心者なので、プロの方のご意見をお待ちしております。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?