Combine と SwiftUI について話しました #関モバ

kanmoba.connpass.com

speakerdeck.com

先月に続いて、関モバで登壇しました。今回は、先週の WWDC 19 で発表された Combine フレームワークについて話しました。また、Combine と SwiftUI との関連についても話しました。

Combine は、標準で用意された Reactive フレームワークです。うまい具合に興味をひくテーマだったようで、登壇後にいろいろ質問やコメントをいただきましたし、懇親会でもいろいろ話ができて良かったです。

質疑応答や懇親会で出てきた話を、覚えている範囲で、登壇資料順に書き留めておきます。

まず Combine という名前はイマイチ感がありますね。Reactive フレームワークに関心が高い人でも、名前を聞いただけではスルーしてしまうのではないでしょうか。ただ、Combine の中の用語(Publisher とか Subscriber とか)は分かりやすい命名になっていて良いと思います。

Combine のドキュメントには Reactive という言葉は出てきませんが、実際のところは Reactive Streams という仕様をベースにしているそうです。

Publisher で Failure 型を Never にすることでエラー出力しない Publisher が定義できることに触れましたが、この実例が SwiftUI との絡みで後述する BindableObject protocol です。Failure == Never という制約を与えることで、UI と bind する Publisher がエラーを流さないことを静的に保証しています。

Swift に Reactive は来たものの async / await はまだ来ていないわけですが、Publishers の Future は近い存在かもしれません。ただ、個人的には async / await 構文が来てほしいと思います。

懇親会の話の中で tryMap が出すエラーは型が指定できるのかという疑問が出たのでその場で調べました。リファレンスによれば Publishers.TryMap.Failure は単なる Error 型であり、具体的なエラー型の情報は失われるようです。ちょっと残念。まあやむをえないですが。

SwiftUI と連携するための BindableObject protocol ですが、名前が分かりにくいですね。懇親会で "Object" という名前はよくない、不要という話が出て、確かにそうだなと感じました。Apple に Feedback を送るべきかも。

資料中で「Property Delegate 機能(Property Wrapper とも呼ばれている)」と記載していましたが、Property Delegate は Proposal での最初の呼び名で、その後 Property Wrapper という名前に変わったのだそうです。教えていただきありがとうございます。

SwiftUI では Property Wrapper として @ObjectBinding の他にも @State や @Environment がありますが、これらがどんな機能でどう使い分けるのかはまだあまり理解できていません。まだまだ調べることはたくさんありますね。

他の人の登壇内容も興味深いものばかりでした。次回の関モバも楽しみにしています。よろしくお願いします。