iOSDC Japan 2024 参加レポート

## はじめに
2024年8月に開催された iOSDC Japan 2024 に、株式会社ゆめみのスカラシップ生として 3 日間現地で参加させていただきました。本記事では、イベントの感想や、特に印象に残ったセッションについてまとめます。

## イベント全体の感想

iOSDCは国内最大級のiOS開発者向けカンファレンスで、たくさんの参加者・スタッフの方たちと、広い会場に所狭しと並んでいるスポンサー企業のブースに圧倒されました。
セッションだけでなく、展示や食事、他の参加者との交流ができる点でお祭りのような活気があり、こうしたイベントに参加するのは初めてでしたがとても楽しむことができました！Twitter(X) で繋がっている FF の方々や、所属していたオンラインサロンの方々も参加されていて、同じ場所で一緒に参加できて嬉しかったです！（交流は人見知りのせいであまりできませんでしたが…）

セッションについてはやはり難しい内容のセッションが多く、話についていけないセッションもありましたが、そう感じているのは自分だけではないと知れて少し安心しました。色々なセッションを見ていると、自分でもそこそこ理解できる内容のセッションもあって、とても勉強になりました。
それでは、現地で聴講したセッションの中で、特に印象に残ったセッションを 3 つピックアップして紹介しようと思います。

## 特に印象に残ったセッション

### 1. [iOS/iPadOSの多様な「ViewController」の徹底解説と実装例](https://fortee.jp/iosdc-japan-2024/proposal/f8766f69-db90-44da-9853-58f682943b12)

1 日目で一番印象に残ったのがこのセッションです。
UIViewController とそれを継承した UINavigationController や UITableViewController といった子孫を、様々なフレームワークから調べ上げていました。調査の結果、iOS 18.0 までの範囲で、81 個もの UIViewController が存在していて、うち UIKit のものは 22 個とのことでした。調査の結果をまとめたスプレットシートは、登壇者の方が X で共有されていました！

https://x.com/haseken_dev/status/1826956825477964117

その81個の中から、発表の最後に紹介された 6 つの UIViewController はどれも面白く、使ってみたくなるようなものばかりでした！AVKit や GameKit など初めて知ったフレームワークの名前も出てきて勉強になりました。

ちなみに以前自分が投稿した下の記事は、このセッションの調査の面白さに触発されて書いた記事でもあります。

https://qiita.com/Se1getsu/items/58937a06a5150871f75e

### 2. [Swift 6のTyped throwsとSwiftにおけるエラーハンドリングの全体像を学ぶ](https://fortee.jp/iosdc-japan-2024/proposal/c48577a8-33f1-4169-96a0-9866adc8db8e)

Swift 6 から利用可能になる [SE-0413: Typed throws](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0413-typed-throws.md) についての内容でした。従来の `throws` の後に括弧をつけて `throws(ParseError)` のようにエラーの型を書けるというものでした。

このプロポーザルの存在は初めて知りましたが、自分は初めて学んだ言語が Java だったので、型付きの `throws` には馴染みがありました。しかしそれは、C# や Kotlin、動的型付けの言語はもちろん、大多数のプログラミング言語には存在しないものであるため、Swift を触った時も今まで違和感を覚えたことはありませんでした。そこで気になったのは、型付きの `throws` は「何故今まで採用されなかったのか？」「Result 型とは何が違うのか？」の2点です。
前者については、Typed throws の問題点という形で紹介されており、Swift Evolution にも安易に Typed throws を使うべきではないと書かれているとのことでした。
後者については、発表の最後に出てきたエラーハンドリングの方法を決定する[フローチャート](https://speakerdeck.com/koher/swift-6notyped-throwstoswiftniokeruerahandoringunoquan-ti-xiang-woxue-bu?slide=92)が視覚的に理解できて分かりやすかったです！同時に、Result 型と `throws` を使い分ける基準についても明確化されて勉強になりました。

### 3. [Mastering AsyncSequence - 使う・作る・他のデザインパターン（クロージャ、Delegate など）から移行する](https://fortee.jp/iosdc-japan-2024/proposal/c0c62dc1-992c-4d9f-8812-02994593d96c)

Concurrency が追加された Swift 5.5 からある [AsyncSequence](https://developer.apple.com/documentation/swift/asyncsequence) についての内容でした。AsyncSequence は非同期版の Sequence で、要素ひとつひとつを非同期で生成します。

`for try await … in` という形が特に印象的でした。`for` は、イテレータを生成して `while let … = iterator.next()` するのと同じ仕組みだという点([スライドp.26](https://speakerdeck.com/treastrain/mastering-asyncsequence?slide=26))を説明した上で、そこに `await` や `try` がつくとどうなるのかを、`while` を使って説明しているところが分かりやすいポイントでした。

このセッションでは AsyncSequence を「通知」として利用することが紹介されていて、Delegate パターンやクロージャ、Combine で実装されたコードを `for await` に置き換える方法について説明されていて面白かったです。通知としては Delegate パターンと同じ一対一の通知のひとつの形として考えられるでしょう。
ただし `for await` をそのように利用する際、注意すべき点として、Task の `@_implicitSelfCapture` が挙げれていました。`for await` が永久的に回り続けることでメモリリークの危険があることから、キャンセルの重要性についても話されていました。

AsyncSequence の話を聞いて、Python の非同期ジェネレータと同じようなものかと少し考えましたが、非同期ジェネレータとは違って `yield` 文がないという点と、それによって API 側はイテレータ型を定義しないといけないという点を考えると、非同期ジェネレータよりも少し複雑そうです。ただ、紹介されていたように他の手法から書き換えた際にスッキリするパターンも多いことから、ひとつの手法として覚えて実践していきたいと思いました。

## まとめ

今回の iOSDC で、難しい内容だったものも含めて色々なセッションを聴講して自分に足りていない部分の知識（Concurrency の Isolation まわりや、マルチモジュールに関することなど）を認識することができて良かったです。また、今まで触れたことのなかったさまざまな分野の話が聞けたことも良い刺激になりました。今回学んだことを今後の学習に活かしていこうと思います。