iOS, Swift, 個人活動, 宣伝

技術同人誌「Swift Concurrency入門」を刊行しました

2022年5月26日からBOOTHより、「Swift Concurrency入門」発売開始しました。
Swift Concurrencyを網羅的に学べ、さらに既存アプリへの適応方法も解説している技術同人誌です。



Swift Concurrency入門

https://personal-factory.booth.pm/items/3888109

今回の記事では技術同人誌「Swift Concurrency入門」についてご紹介します。

Swift Concurrencyとは?

Swift ConcurrencyはSwift 5.5から登場した並行処理を言語機能レベルでサポートするSwiftの新しい機能です。
今までクロージャーで実装していた非同期処理をasyncawaitを使うことで処理の流れが格段にわかりやすくなります。
また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、覚えなければいけない概念が数多くあります。
asyncawaitActorMainActorTask, TaskGroupAsyncSequenceSendableなどなどです。

本書は一冊で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 15.0
  • Xcode 13.3.1
  • Swift 5.6
  • macOS 12.2.1
  • MacBook Pro(14インチ、2021)チップ: Apple M1 Max

最後に

技術同人誌「Swift Concurrency入門」の紹介でした。

BOOTHでは、第一章と二章はおためし版として無料公開しているので、ぜひダウンロードして本書の雰囲気を味わってください。
もしよかったらぜひ購入お願いします。

本書が皆さんのプロジェクトの手助けになれば幸いです。



Swift Concurrency入門

https://personal-factory.booth.pm/items/3888109

Author image

About Sato Takeshi

  • Tokyo, Japan