2020年Objective-Cの旅

まだObjective-Cで消耗してるけど、なんか質問ある?

いや、別にSwiftが嫌いな訳じゃない。「Xcode + Swift」とか「Android Studio + Kotlin」みたいな「開発環境込みでの『モダンな静的型付け言語』」の便利さは体験済みな訳で、私だって今からiOS/macOSアプリを書くならSwiftを第一候補とするだろう。

なのだけど、例えば既存のPC向けクロスプラットフォーム・アプリをスマホに移植する場合、私の周囲にはアプリのコア部分がC++で書かれたものが多い。

そのようなアプリは、GUIは各プラットフォームのフレームワークで実現していて、コア部分はC++で書かれていて、さらにコア部分の中の機種依存層は各プラットフォームのライブラリをC/C++ベースの言語で叩いていて――という構造を持っている。

Windows向けの実装だと、以下のような感じになっていたりする。

こんなアプリをiOSに移植しようとすると、Swiftからコア部分を利用しやすいようにObjective-Cでラッピングして*1、コア部分の中の機種依存層の中身はObjective-C++で書くかC/C++を使いつつCoreFoundationなどのC言語ベースのAPIを叩く――というアプローチをとることになる。

で、Swiftで書けるGUI側は若人に任せて、おっさんの私は泥臭い下回りを担当する……あれ? 結局Swiftのコードを書く機会が少ないぞ、と。

まあそんな訳で、2020年になってもObjective-Cのコードを書く機会があるのだけど、今となっては「モダンなObjective-C」を学ぶ情報源に乏しい。さてはて、どうしたものか?

Apple公式のObjective-Cのドキュメントの所在

Apple Developerのサイトを見た感じ、Objective-Cのドキュメントは軒並みDocumentation Archiveに置いてあるようだ。

ここに置いてあるということは `no longer updated' ということだ。まあ、そうだよね。

ところで、一部のドキュメントは日本語版が作成されていたはずなのだけど、それらへのリンクは無いのだろうか? Documentation Archiveのものは全部英語っぽいのだが……。

日本語の書籍は電子書籍が頼り

Apple公式の資料の扱いがあんな感じなので、日本語で書かれた書籍は絶滅寸前――と思いきや、意外とKindleなどの電子書籍なら購入できるようだ。

今時Objective-Cを触る人は、かつてのiOSアプリ開発のような「オールObjective-C」ではなくて、私みたいに「Swiftとの連携」とか「C/C++との連携」とか、少々マニアックな用途で使うことが多いと思う。

そういう「若干、言語のコアな部分に踏み込む」ような用途を考えると、『Effective Objective-C 2.0』や『詳解 Objective-C 2.0 第3版』あたりを推奨したいところである。

Effective Objective-C 2.0

Effective Objective-C 2.0

詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版

Swiftとの連携に関しては『Swift実践入門』や『詳解Swift』の古い版が良いと思う。古い版では、Swiftとの連携について章を設けて書かれている。

私は『Swift実践入門』の最初の版と『詳解Swift 第3版』を持っていて、この2冊ではSwiftとの連携について書かれていることを確認している。

詳解Swift 第3版

詳解Swift 第3版

ネット上で章立てを確認した感じでは『Swift実践入門 改訂新版』や『詳解Swift 第4版』でも記述があるように見えるが、実際のところは不明である。

詳解 Swift 第4版

詳解 Swift 第4版

一方で現在出版されている『Swift実践入門 増補改訂第3版』や『詳解Swift 第5版』では、その辺の記述が省かれている。なので、せっかく新しい版を買ったのに、旧版を知人に譲ったりネットで売ったりすることができない。本棚が圧迫されていく……。

実際のところ、2020年にObjective-Cってどうなのよ?

SwiftやKotlinは、型チェックまわりを理解すれば安全なコードが書けるし*2統合開発環境と組み合わせればコーディング時の生産性が高くなるし、言語や標準ライブラリ自体もモダンな機能が取り入れられていて使いやすい。便利な言語なことは間違いない。

最適化についても、Kotlinは分からないが、Swiftは色々と頑張ってくれているようだ。

なのだけど、一定以上のリアルタイム性が求められるケースでは、暗黙のうちにヒープ領域へのメモリアロケートや排他のためのロックが発生することがある、という振る舞いが仇となる。便利さは何かしらの犠牲の下に成り立っているものだ。

そういう時には「C言語におけるインライン・アセンブラ」のように、局所的にC/C++を併用せざるを得ないことがある。

このような場面にて、アプリケーションの大半はSwiftで書きつつ、一部モジュールのみインラインにC/C++のコードを書けるObjective-CObjective-C++で実装したり、C/C++でモジュールを書いた上でObjective-Cでラッピングする――というアプローチは悪くない選択であるし、実際のところそれなりに機能する。

少なくとも今しばらくは、タンスのいちばん下の引き出しにObjective-CObjective-C++がしまわれている日々が続くだろう。捨て去ってしまうのは、まだちょっと早いようだ。

*1:インタフェースはObjective-Cで、中身はObjective-C++で書く。

*2:ふわっと理解する程度なら短時間で済むし、その程度の理解でも効果が得られる。