iOSDCをきっかけに「Swift5 async/await 研究読本」を購入して読んだ
ツイート
「Swift 5 async/await 研究読本」を キュリオシティソフトウェア書店 で購入しました! https://t.co/rE1Crg010e #booth_pm #iosdc #b
— m (@murakammmmm) 2018年8月31日
async/awaitの本読み終わった! pic.twitter.com/E1hCf4twxd
— m (@murakammmmm) 2018年8月31日
本の中身の前に
- 私はasync/awaitについて以下の事前知識を持っていました
- Swiftでネストの深いクロージャを書き、レビュアーと「これわかりずらいけど素直に書いたらこうするしかないよね」みたいな話をしたことがありました
- @koherさんの Proposalには載っていないSwift 5のasync/awaitが素晴らしいと思う理論的背景 を読んだことがありました
- async/awaitをJavascriptで業務・プライベートで利用していました
- Kotlin, Python, Dartで実装されていて、コード例は目にしたことがありました
- iOSDCで Swiftの生みの親によるasync/await for Swiftを徹底解説し、新しい非同期処理の手法を理解する by 今城 善矩 | プロポーザル | iOSDC Japan 2018 - fortee.jp を見ていました
- スライドにツイートを乗せてくれていて、リアクションをもらえたのが楽しかったのと「( ˘⊖˘) 。o(ここで購入ツイート流したらウケるだろうなあ)」という悪い思い付きによって購入してしまいました
- 先に購入ツイートをした方がいたので二番煎じになってしまいましたが、タイミングがかなり良かったのでウケは良かったです
- せっかく買ったのに読まないのは失礼だろうとの気持ちで分量も多くはない(奥付までで50ページ程度)なので、ざっくり読みました。
本の中身(ざっくり)
第1章 async/awaitとは何か
- ネストの深いクロージャをasync/awaitを利用すること同期的でシンプルなコードとして表現できることについて説明しています。
第2章 Hydraで理解するasync/await
- すでにSwiftでasync/awaitを実装しているライブラリ https://github.com/malcommac/Hydra の使い方についての説明しています。
- Promise単独の例とasync/awaitを併用した例を並べることでasync/await構文がやっていることについて解説しています。
- 確かJavascriptだとPromiseが先に入っていて、後からasync/awaitが追加されていたはずなので、これが自然な導入なんでしょうか。
- エラーハンドリングについてもJavasciprtとおんなじ感じだった記憶があるので、あーそうそうそんな感じだよね、と自然に読めました。初見の人はどうなんだろう。
第3章 Hydraのasync/await実装を読む
- 非同期処理の完了待ちをどうやって既存のSwiftの機能で実装しているかについて説明しています。
- セマフォに尽きる、という印象でした。並行処理の待ちといえばこいつですよね。
最近使ってなかったからこいつの存在を完全に忘れてた複雑怪奇な処理を実装するときにお世話になっていました。 - Promiseのallは存在は知っていましたがzipなんてあったっけ?、と思ってMDNを調べたらjavascriptにはなくてああ動的型付けだからかと解釈しました。
- googleはObj-cで実装したライブラリを公開している( https://github.com/google/promises )。恐ろしい。
第4章 「クリス・ラトナー氏が提案しようとし ている async/await for Swift のプロ ポーザルの下書きを解説する」
- タイトルの通り、今回のasync/awaitの提案(プロポーザル)を和訳した上で説明しています。
- 中身も大事ですがこういう感じで新機能を提案するのか、という意味でも勉強になりました。
雑感
- ツイートもしましたが、すでにKotlin・Javascript・Dartにはasync/awaitが入っているので、今回のSwift5で主要なネイティブアプリの言語でasyncが実装されることになります。Webを含めてフロントエンドプログラマの教養とか基礎知識として理解する必要性が大きいと思っています。
- 会場で質問しましたが、Rxと競合している部分があるので置き換わりが発生すると思っています。通信系のライブラリや画像キャッシュライブラリでReactive Extensionsを作っているようなものは処理をasync/awaitで実装するだろうと見込んでいます。一方でRxCocoaを含むUIとのbinding系は置き換わらない気がするのでそこはRxを続けるかな、と考えています。