幾つかの気になるブログも見終わりまして、再び本編の クロージャーにおける循環参照
に戻ろうかと思っていたのですけれど、時を同じくして Swift 5.9 もリリースされました。そんなせっかくの機会なので、新たに導入される機能みたいなところを眺めてみようと思います。とはいえぜんぶは理解できていないため、自分の知っているところを中心に見ていくことになりますけれど、どうぞよろしくお願いしますね。
—————————————————————————————————————————— 熊谷さんのやさしい Swift 勉強会 #300
00:00 開始 00:12 今回の展望 02:01 Swift 5.9 の新機能 03:17 C++ Interoperability が魅力的 06:06 Swift マクロで出来ること 09:10 マクロは Swift 入門書にも載っている技術 11:26 マクロも普段使いなターゲットのひとつ 14:25 可変長ジェネリクスを使うには慣れが必要そう 16:26 パフォーマンスをコントロールするための、所有権 18:11 所有権が実用的になるのはもう少し先になりそう 18:50 そのほかの Swift 5.9 の新機能 20:41 C++ Interoperability の概要 21:36 Swift Package Manager にも手が加えられているらしい 22:36 Swift 5.9 で取り込まれたプロポーザル 24:08 前方宣言 26:22 めずらしく、タプルを返す標準機能 28:33 複製できない構造体は発展途上 32:48 複製不可な構造体は deinit を持てる 36:22 Observation はアプリ作りで注目されている様子 37:16 Never 型が Codable に準拠したらしい 41:16 クロージングと次回の展望 ——————————————————————————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #300
始めましょう。今日は、ここ数ヶ月ずっと他の方のブログを見ていましたが、そろそろ本編に戻れそうだと思います。本編について念のため説明しますと、この勉強会はAppleの「The Swift Programming Language」に沿って進めています。最近は脱線しがちでしたが、そろそろ本来の目的に戻ろうと思います。
特に、最近注目すべきはXcode 15の登場とSwift 5.9のリリースです。この勉強会は一般公開するため、Swift 5.9がリリースされるまでは新しいバージョンに触れるのが難しい状況でした。リリース前にあまり深く触れることができなかったので、せっかくですからXcodeで実際に動かしながら新機能に触れ、勉強会の時間を使って慣れていけたら良いと思います。
まず、Swiftの公式ページにはSwift 5.9のドキュメントが公開されています。確か、最新のリリース情報の中にSwift 5.9がありましたね。具体的なドキュメントのURLを見つけられていないのですが、一般的な「The Swift Programming Language」のドキュメントとは異なる場所にあるはずです。
さて、Swift 5.9の新機能で個人的に興味深いのがC++との互換性です。これは、Objective-Cとのインターオペラビリティと同じような形で、SwiftからC++を利用できるというものです。まだ詳細を掴み切れていませんが、Objective-C++も視野に入っているようです。
昔、私はObjective-C++に魅了され、様々なコードをObjective-C++とC++で書いていました。その時に、Objective-C++のコードをSwiftで呼ぶのが非常に苦労しました。具体的には、一度Objective-Cに変換し、そのインターフェースのラッパーを作成し、それをSwiftで使用するという手間がかかりました。これにより、一つのクラスに対して4つぐらいのファイルが必要になっていました。
そうした経験もあって、C++互換性の強化は非常に興味深いです。ただ、ソースコードは10年も経つと使い物にならないことが多いので、まだ試していません。しかし、C++が得意な人や最適化されたコードを書きたい人には有効な機能だと思います。また、C++ライブラリをインポートするなどの使い方も考えられます。
それとは別に、Swift 5.9の新機能として注目すべきなのはマクロ機能です。まだ詳しく追いかけていないのですが、これについても好んで使う人がいるかもしれません。他にも色々な新機能があるので、これから少しずつ見ていきたいと思います。 もちろん、プライベートなプロダクトでも全然オッケーです。ただ、このマクロでできることは、コンパイル時にビルドする前にあらかじめ作っておいたルールに従ってコードを展開することです。ここでの「展開する」というのは、既存のコードに追加することを指します。既存のコードを書き換えたり消したりすることはできません。
マクロとしては「スイートシンタックス」というのを使ってソースコードを解析し、変換していくもののようです。マクロには主に2つのタイプがあります。1つは「装飾する」ためのマクロ、もう1つは「スタンドアロン」で独立して動くマクロです。Swiftの特徴として、これらのマクロはSwiftの言語仕様で定義できます。Swiftは他の言語の書き方を勉強させず、Swiftの書き方で様々なことをできるようにするというコンセプトがあります。
たとえばプロパティアフォードやリタルトビルダーなどのドメイン固有言語もSwiftコードで定義できます。また、SwiftのパッケージマネージャーもSwift言語で定義されており、YAMLなど他の形式を使わずに済むようになっています。同じように、マクロもSwift言語で定義し、適切なプロトコルに準拠させて実装していくという作りになっています。
このマクロに関しては、自分ももう少し勉強して、知識がついてから改めて紹介しようと思います。マクロというと特別なツールのように感じますが、『The Swift Programming Language』にもちゃんと記載されています。このドキュメントの中では、マクロについても詳しく説明されています。その概要を押さえた上でSwiftの文法を勉強し、実際に作っていく必要があります。
マクロの実装については、まずプロトコルに準拠させてコードを書いていきます。また、パッケージマネージャーを使ってマクロをターゲットにし、Xcodeにもマクロのターゲットを設定します。この勉強会では、例えばエクステンションを作成するような感覚でマクロについて学んでいくことになるでしょう。
マクロを自分で実装する機会はあまり多くないかもしれませんが、一度触れて慣れておくと、いざというときに使えるようになると思います。これはプロパティラッパーと同じ感じで、プロジェクト内で使わなくても知識として持っておくことで応用範囲が広がります。突然の登場でも慌てずに対処できるようになります。 とりあえず、向き合っておくといいのかなと個人的には思いますが、わからないことも多いですよね。どのレベル感で話すかによりますが、チームでの勉強会なので、あまり軽く持ち出すものではない気がします。どちらにせよ、この話題についてはおいおい話すとして、まずは調べてから話そうと思います。もちろん、今すぐ話したい人がいれば、話してくれてもオッケーです。自分が調べていなくても全然問題ありません。
次にどこを見ておくべきかというと、パラメータの扱いですね。これも難しいテーマです。いわゆるジェネリクスの型の数、型じゃない引数の数を動的にできるという機能です。このようにパラメータを取って、それを一発で扱うといった感じです。各型に対して各型を並べて取ることができます。
このリピートというキーワードがなかなか厄介で、癖がありますね。使い慣れていかないと難しいです。理屈ではわかっていても、実際に使おうと思うと難しいことが多いです。例えるなら、待機呼び出しが苦手だった経験がある人もいるかもしれませんが、同様の難しさがあります。待機呼び出しも理屈では理解できても、実際には使いこなすのが難しいです。
また、Prologというプログラミング言語があり、論理型の言語なんですが、「AならばB、BならばC、ではAならばC」といった感じの言語です。これも理屈ではわかっていても、自分でコーディングしようとすると難しい。同様に、理解と実際の使用には大きなギャップがあると感じます。これも後で試してみたいですね。
さらに、オーナーシップという概念もあります。今日の機能一覧にどどんと出ていて、なおさら難しそうです。以前は共有資源やコピーイン・コピーアウトといった概念がありましたが、今では消費という考え方が加わりました。プログラマーが一方的に最適化をかけられるようになったという仕様です。以前はコンパイラが判断して最適化してくれていたのですが、限界があるため、プログラマーにも委ねられるようになりました。これによってハイパフォーマンスなコードを書くことができるようになります。