Swiftは強力で、また、比較的新しい言語です。世の中にはC言語や、C++、Objective-Cで書かれたオープンソースライブラリが多くあります。ユニークなアプリを作るチャンスを3倍にするために、これを利用する手はないのでしょうか? あります! このトークでは、C、C++、Objective-Cの関係性を説明するための基本をなぞり、SwiftのプロジェクトにDependencyを追加する方法をデモします。
[
Spotifyというかなり大きなコードを扱っています。その中にはC, Objective-C, C++など多くのコードが含まれています。
Cがうまれ、組み込みなどに使われていました。クラスやオブジェクトに対応していませんでした
C++をつくりC拡張でObjectOrientedProgramingをサポートしました。
Objective-CはC++と同じ時期に生まれましたが、Cの上に薄いレイヤーが乗っているという形です。
ソースファイルをコンパイルするように
.mmファイルを見たことがある人
Swiftは2014年に生まれました、Cocoaと作業できるように生まれてきた。ObjectiveCの多くを使える。ランタイムライブラリも使っている。1つのプログラムで走ることができる。
SwiftはCとダイレクトにコミュニケーションすることができる。C++とダイレクトにコミュニケーションは出来ない。
4言語のコネクションが話してみたら面白いと思いました。
生花のようです
使うものを選んだら、配置していく
アプリケーションはゴールを考え、ふさわしいライブラリを選んでくる。目的はプレゼンテーションなり、枝や花を選んでくるが、これはCやObjC,C++ということになります。
おかしなところや足りないことがあれば補足していく。
これで一歩下がって全体を見ていく
ObjCフレームワークを足すとき、バニラObjCというフレームワークを使ってきました。サードパーティのものも扱っていく必要がありますがセットアップは似ています。
Xcodeproject、あるいはFrameworkをリンクする。
SwiftClassでVanillaObjCをImportする
randmStringをコールする
これで全部が出来上がる
libBasicCppLibを作っています。
ダイレクトにはコミュニケーションできないので間にObjective-Cを挟まないといけない
ラッパーをmから.mmに名前を付け替え、C++とObjective-Cを両方コンパイルできるように成る。
Objective-Cのフレームワークの中でリンクしてモジュールをインポートしてObjectiveCのファンクションをコールする
CはStaticLibとしてコンパイルされる
randomStringのみです
自動的にヘッダーファイルを読むわけではない。Cのヘッダーは読めない。
module map というファイルを作成する
Headerを加えていく、exportするとサブモジュールの中身すべてがexportされる
モジュールマップのディレクトリに対してSWIFT_INCLUDE_。。。を指定する
依存関係を指定できました
Objective-CはSwiftにトランスレーションしやすい
C++はCを使わなくてはいけない、でもインターフェースがデベロッパーフレンドリーでない
フレンドリーに、詳細を省くために、ラッパーを使うということに成る
古いObjecitve-CがあればNS_SWIFT_NAMEで名前を変換する必要がある
Cはまた別物
ポインタがあります。
値を指定しているのではなく先頭のアドレスを挿しています。
Swiftからは安全ではない、Cライブラリにどのようにポインタのメモリが管理されているかわからない
これで全く終わりかと言うとそうではない、間違っている場所がある、マニュアルメモリ管理が必要
randomString functionでメモリを開放する必要がある。ありやすいやり方がある。
Int → Int32にはtype castが必要
Closureのタイプキャスト
コンテキストをキャプチャするローカル関数からは形成することは出来ない
コンテキストは一連のすべての変数
クロージャー、ローカルファンクションの中でSwiftにおいては別の変数を含んでいます。
コンテキストキャプチャリングをするのは、コンパイラは、アウターファンクションの中で使われているものを使うということになります。
SwiftではどれくらいC関数をクロージャーの中にホールドしておくべきかわからないので、キャプチャされたコンテンツを許可しない
そこでコントロールが必要になる
getNextValueのライフタイムを管理してやる必要がある。
最後に C++
Cから学んだことをそのまま使えます
NSStringはCStringを通って、C++とObjective-Cの間に存在する
一つのパラメータをとってくる、ラップするためにObjCの中でラッパークラスを作ります。
プロセッサーのマクロの部分ですが、これはC、それからC++、ObjCで使われているます
そしてタイプを指定して上げる必要がある
そして、Swiftだけのライブラリにこれを限定する必要はなく、C++、ObjCで使っていくことが可能