技術解説本「Swift Concurrency入門」を刊行しました
今回の記事では技術解説本「Swift Concurrency入門」「一冊でマスター!Swift Concurrency入門」についてご紹介します。
2022年5月26日からBOOTHより、「Swift Concurrency入門」発売開始しました。
Swift Concurrencyを網羅的に学べ、さらに既存アプリへの適応方法も解説している技術同人誌です。
更に、この技術同人誌は2022年7月29日、インプレスR&D社より商業誌版も発売されました。
組版は同人誌と商業誌版で異なりますが、掲載内容は同じです。
一冊でマスター!Swift Concurrency入門です。
今回の記事では技術解説本「Swift Concurrency入門」「一冊でマスター!Swift Concurrency入門」についてご紹介します。
Swift Concurrencyとは?
Swift ConcurrencyはSwift 5.5から登場した並行処理を言語機能レベルでサポートするSwiftの新しい機能です。
今までクロージャーで実装していた非同期処理をasync
やawait
を使うことで処理の流れが格段にわかりやすくなります。
またactor
を使うことで並行処理で起きがちな厄介な不具合、データ競合を簡単に防ぐこともできます。
以前集まれSwift好き!Swift愛好会 vol.65 @ オンラインにて私がSwift Concurrencyの概要をまとめた資料があるのでぜひこちらご覧ください。
Swift ConcurrencyとiOSエンジニア
ちなみにSwift Concurrencyはリリース当初(2021年9月21日)のXcode 13ではiOS 15からしか利用できませんでした。
言語機能にも関わらずOSの制限があったのです。
その後、2021年12月13日にXcode 13.2がリリースされ、iOS 13, 14にもSwift Concurrencyの機能がバックポートされるようになりました。
Xcode 13.2ではiOS 13, 14でSwift Concurrencyのコードを実装すると実機でアプリがクラッシュする不具合がありました。2022年5月現在iOS 13, 14以上でSwift Concurrencyを使う場合はXcode 13.3.1がおすすめです。Xcode 13.3.1ではアプリクラッシュの不具合を含めてバックポートの不具合が修正されています。
iOS 13, 14でもSwift Concurrencyを使えるようになったので、多くのiOSアプリでも導入ができるようになりました。
Swift 6の影響
Swift ConcurrencyがiOS 13, 14でも使えるようになった一方で、どうやらSwift 6ではSwift ConcurrencyのSendable
対応が必須になりそうなのです。
Sendable
とはデータ競合が起こらないことを表す型や属性の総称です。
データ競合起こらない型をSendable
プロトコルで表し、関数用には@Sendable
属性が用意されています。
並行処理コード内で、関数から関数にデータを渡す際にデータ競合が起こらないことを保証するためにSendable
が使われます。
Swift 6では並行処理コードでのSendable
利用が必須になり、適切にSendable
に適応していないコードはコンパイルエラーになる予定だそうです。
詳しくはswift-evolutionのこちらをご覧ください。
このSE-0337の提案内容をざっくりまとめるとこのようになります。
- Swift 5.5から
Sendable
が導入されたが、ファーストリリースで影響が見えなかったため、Sendable
のコンパイラチェックを甘くしていた - Swift 6では
Sendable
利用のコンパイラチェックを厳密にする予定。それにより不適切なコードはコンパイルエラーになる - しかし、それはあまりにも影響が大きすぎる。C言語や、Objective-Cを含め、すべてのライブラリーがSwift 6リリース前までにSwift Concurrency対応できるわけではない
Sendable
のコンパイラチェックのレベルを下げられるように@preconcurrency
をSwift 5.6から導入した
SwiftコアチームはSwift 2からSwift 3の破壊的変更の反省を生かし、段階的にSwift Concurrency対応をできるように準備をしているとのことです。
その一環がSE-0337です。
Swift 6がいつリリースするのかは私はまだ把握してませんが、Swift 6に適応する前にiOSのコードはSendable
を適切に対応するか、@preconcurrency
でオプトアウトするかをしなければいけないようです。
つまり、Swift Concurrency対応はいずれ、すべてのプロジェクトに影響を及ぼす可能性があるのです。
本書の内容
本書は、そんなSwift Concurrencyを深いレベルまで理解できる解説本です。
2022年5月現在、日本語で網羅的にSwift Concurrencyを解説している書籍は他にありません。
Swift Concurrency、覚えなければいけない概念が数多くあります。
async
、await
、Actor
、MainActor
、Task
, TaskGroup
、AsyncSequence
、Sendable
などなどです。
本書は一冊でSwift Concurrencyの概要をほぼ全て網羅しています。
先ほど話した@preconcurrency
ももちろん本書で解説されています。
また各章にそれぞれサンプルコードが付属しているので、どんな動作をするのかを試して理解を深められます。
さっと全体を理解するにもよし、わからなくなったときの辞書代わりに使うのもよしな構成になっています。
目次
【第一章 async/await】
非同期処理をasync/awaitで記述できるようになりました。従来クロージャーによるコールバックと比べてどのように簡潔、安全になったのかを解説します。
【第二章 Actor/データ競合を守る新しい型】
マルチスレッドプログラミングにおいて、データ競合(data race)は典型的な不具合のひとつです。Swift Concurrencyではデータ競合を防ぐ新しい型、Actorが導入されました。どのような特徴があるのかを解説します。
【第三章 AsyncSequence】
繰り返し処理でお馴染みのfor
文を非同期で書きましょう。
for await inループとそれを実現するAsyncSequenceプロトコルを学びます。
【第四章 Task】
Swift Concurrencyの並行処理はTaskという単位で行われます。
Taskの特徴を解説します。
【第五章 Sendable】
Actorを始め、並行コードにおいて、データ競合なしにデータを同時並行処理間で渡せるかどうかを表す新しいプロトコルSendableが登場しました。Sendableを解説し、コンパイラがエラーを出力した場合の対処方法を探ります。
Swift 5.6の@preconcurrency
の使い方や意義も収録されています。
【第六章 既存のプロジェクトにSwift Concurrencyを導入】
既存のプロジェクトにSwift Concurrencyを導入する方法を解説します。async/await
、@MainActor
だけでなく、Swift 5.6の対応も行います。
動作環境
本書は次の環境で検証しています。
- iOS 14.5, iOS 15.0
- Xcode 13.4.1
- Swift 5.6
- macOS 12.4
- MacBook Pro(14 インチ、2021) チップ: Apple M1 Max
最後に
技術解説本「Swift Concurrency入門」「一冊でマスター!Swift Concurrency入門」の紹介でした。
同人誌版の方はBOOTHにて、第一章と二章はおためし版として無料公開しているので、ぜひダウンロードして本書の雰囲気を味わってください。
もしよかったらぜひ購入お願いします。
本書が皆さんのプロジェクトの手助けになれば幸いです。