ペンギン村 Tech Blog

技術をこよなく愛するエンジニア集団が在住するペンギン村から、世界へ役立つ(かもしれない)技術情報を発信する技術系ブログです。某アラレちゃんが済む村とは一切関係ありません。んちゃ!

セッション画像で振り返る、去年の WWDC 21。

どうも、トビ(@tobi462)です。

今年もついに WWDC の季節がやってきてしまいましたね!

そんなわけで去年の WWDC 21 を振り返ってみましょう!(え?

Effective WWDC

私はここ1ヶ月くらい WWDC 21 のセッションの視聴を続けていました。

なぜに今さら去年の WWDC セッションを?と疑問を感じられる方も多いと思うのですが、私の中で Effective WWDC というものがありまして。

まぁ、だいたいツイートの通りですね。

付け加えるなら、日本語字幕も追加されているので、英語が苦手でも視聴しやすくなっているのも良い点かと思います。

WWDC 21 では、iOS 15+ 向けの API が多く追加されましたが、先日その iOS 15 のシェアが 8割を超えたそうなので、ようやく iOS 14 のサポートを切ることを検討し始められる頃かと思います。

そういう意味ではこの時期に、去年の WWDC セッションをチェックするというのは、割と学習戦略的にありなのではないかと思っています。

はじめに

さて、前置きが長くなりました。

そんなわけで WWDC 22 が開催される前のタイミングで WWDC 21 のハイライトを振り返ってみよう というのがこの記事の主題になります。

私もすべてのセッションを視聴しているわけではありませんので、私が視聴したセッションのハイライトを 雰囲気レベル で思い出してみる、という感じになるかと思います。

全体的に

私の感覚としては『次世代に向けた開発基盤の整備が一気に進められた年』という印象を受けています。

  • Xcode Cloud
  • Swift Concurrency(async/await)
  • SF Symbols 3.0
  • Foundation の次世代 API(AttributedString、Formatter)
  • SwiftUI 3.0
  • DocC
  • Swift Package Collection
  • Swift-Algorithms / Swift-Collections
  • Test Flight の強化
  • macOS アプリ向けの公証ツール
  • XCTest への API 追加
  • MetricKit の進化

前述したとおりあくまで私が見たセッションに偏っていますが、これだけ見ても開発基盤やツールの開発・整備に多くのエネルギーとコストが割かれたことがよく分かります。

一方で、ユーザ向けの機能として発表されたものはそれほど多くありません。

  • SharePlay
  • 集中モード
  • クイックメモ
  • iPadOS の順当な進化
  • Mapアプリの強化

どれもインパクトに欠けるもので、何より開発者が API としてコントロールできるものは非常に限定的です。

リファクタリングが直接的な価値を生み出さないように、開発基盤やツールへの投資はビジネス的に見れば Apple としてはそれほど美味しく無いはずです。

そういった意味で、Apple としては次世代の開発基盤に向けて本気で投資した年なのだと私は感じました。

そして、それが意味するのは Apple プラットフォームの開発者にとって、学ぶことが非常に多かった年だろうということです。

さて、これからテーマごとに概要や関連セッションをまとめていきますが、本当に雰囲気レベルで振り返られればというレベルですので、詳細についてはよろしければ Twitter のまとめスレも御覧ください。

Xcode Cloud

Platforms State of the Union でもっともプッシュされていたのは、Apple 製の CI/CD サービスである Xcode Cloud ではないでしょうか。

これは単に Apple 純正の CI/CD サービスというだけではなく、Xcode という IDE と統合されているという点が大きいように思います。

私は Xcode Cloud 関連のセッションを見ていませんが、Platforms State of the Union を見るだけでもかなりうまく統合されているように感じました。

Xcode Cloud は去年の秋頃にサービス提供という予定だったと思いますが、結局今年の WWDC 22 まで一般利用の開始には至りませんでした。

その理由は定かではありませんが、今年の WWDC 22 で一般利用が開始されるのは間違いないでしょう。

Swift Concurrency

多くの Apple プラットフォーム開発者にとって、もっとも大きな話題となったのが Swift Concurrency(async/await) ではないでしょうか。

Apple しては珍しく、過去の OS バージョンへのバックデプロイも行われ、すでに開発者は気軽に async/await を利用できる状況になっています。

async/await は、これまでのコールバックや DispatcheQueue のシンタックスシュガーなどではなく、完全に1から再設計された 非同期・並列処理の仕組みです。簡潔にコードを記述でき、コンパイル時に多くの間違いを発見でき、さらにパフォーマンスも高いと言われています。

もはや利用しない理由は無いと考えられるため、Apple プラットフォーム開発者がいち早くキャッチアップすべき技術だと感じます。

Meet async/await in Swift

developer.apple.com

既存の API の問題点から、それをどのように async/await に書き換えるか、そしてそれがどのように機能するか(Suspend / Resume)について解説された、おそらく最初に目を通すべきであろうセッション。

コールバック API の難しさと問題点

async/await で書き直したコード

中断(suspend)と再開(resume)の仕組み

既存の API を async/await に対応する

まとめスレ: https://twitter.com/tobi462/status/1527456034666971136

Use async/await with URLSession

developer.apple.com

async/await によって、URLSession の使い方がどのように変化するかについて解説されたセッション。

async/await に対応した URLSession

タスクのキャンセル処理

レスポンスが到着した順に処理することも

まとめスレ: https://twitter.com/tobi462/status/1527571390639271936

Protect mutable state with Swift actors

developer.apple.com

新しい同期の仕組みとして用意された Actor や、それと関連する @Sendable や MainActor について解説されたセッション。

マルチスレッドにおけるデータ競合

新しく登場した Actor 型

並行処理で安全に扱える Sendable

クロージャでも利用できる

メインスレッドでの実行が保証される Main Actor

まとめスレ: https://twitter.com/tobi462/status/1527607077530931202

Meet AsyncSequence

developer.apple.com

AsyncSequencefor-await-in 構文やその仕組み、既存のコールバックベースの API をラップするのに便利な AsyncStream などについて解説されたセッション。

lines で到着した順に行単位で処理できる

for-await-inの仕組みはfor-inとほぼ同じ

無限シーケンスのときは Task を利用できる

Notification も対応している

AsyncStream で AsyncSequence に対応する

まとめスレ: https://twitter.com/tobi462/status/1527800398849134592

Explore structured concurrency in Swift

developer.apple.com

構造化された並列処理についての考え方、async-let 構文、グループ化された Task、キャンセルの仕組みなどについて解説されたセッション。

async-let 構文の仕組み

async-let と try-await のコードの書き方

構造化されたタスクツリー

タスクグループを利用した並行処理

各API の比較

まとめスレ: https://twitter.com/tobi462/status/1528493152591806464

Swift concurrency: Behind the scenes

developer.apple.com

舞台裏で何が起きているかについて解説された上級者向けのセッション。(私は1回視聴したくらいでは十分に理解できなかった)

SF Symbols 3.0

SwiftUI と同時に登場した SF Symbols ですが、3.0 でもそれなりに大きな変更がありました。

SF Symbols 2.0 ではマルチカラーのサポートが印象的でしたが、3.0 では 「Hierarchical」と「Palette」というレンダリングモードが追加 されました。

どちらも SF Symbols に「レイヤー」という概念が導入されたことに端を発しており、「Hierarchical」ではシステムが自動的に透過を適用するのに対し、「Palette」は自分で色を指定できるというものです。

これによって SF Symbols によるデザインの幅も大きく広がったと言えます。

また、SwiftUI ではコンテキストに応じて自動的に適切なアイコンが選択される 「バリアント」 という概念も追加されたり、ローカライゼーションに対応したシンボルもあります。

What’s new in SF Symbols

developer.apple.com

SF Symbols の復習から始まり、バリアント、新しいレンダリングモードなどについて解説されたセッション。システムカラーの変更についても触れられています。

バリアントの考え方

Hierarchical モードによるレンダリング

Palette モードによるレンダリング(好きな色を指定できる)

整理されたシステムカラー

まとめスレ: https://twitter.com/tobi462/status/1526838587853262848

Explore the SF Symbols 3 app

developer.apple.com

SF Symbols 3 アプリの利用方法について解説されたセッション。基本的な使い方から、カスタムシンボルの扱い方、今年追加されたレンダリングモードの確認まで解説されている。

シンボルの色やレンダリングモードの変更

カスタムシンボルでのレイヤ設定

まとめスレ: https://twitter.com/tobi462/status/1526936444534951936

SF Symbols in SwiftUI

developer.apple.com

SwiftUI における SF Symbols の基本についての復習から、バリアントがどのように機能するか、新しいレンダリングモードをどのように利用するか、などについて解説されたセッション。

SwiftUI での基本的な使い方

コンテキストに応じてバリアントが変化する

バリアントの種類

新しいレンダリングモードである「Hierarchical」と「Palette」

「Hierarchical」モードの利用

「Palette」モードの利用

まとめスレ: https://twitter.com/tobi462/status/1526352294622613504

Foundation

Foundation 周りも強化・進化が進んでいます。

NSAttributedString に代わる再設計された AttributedString に、同じく再設計された Formatter API 、そしてそれらと関連した ローカライズ機能 の強化。

これらは一見地味に見えますが、今後10年以上は利用されるであろう次世代の API だと思います。

What’s new in Foundation

developer.apple.com

前述した Foundation まわりの API について解説されたセッション。

AttributedString を利用した例

AttributedContainer で独立して属性を管理できる

String の Range と互換性がある

Markdown で独自の属性も指定できる

新しい Formatter API の例

まとめスレ: https://twitter.com/tobi462/status/1526714737421352961

SwiftUI

そして、もちろん SwiftUI も順当に進化しています。

これまで不足していたコントロールや API などが追加され、iOS / iPadOS においては かなり実用レベルに達した のではないでしょうか(macOS は API も不足していればバグも多く、パフォーマンスも悪い)。

CoreGraphics に代わる API として Canvas も用意され、SwiftUI に欠けていた重要なピースがようやく全て埋まったような気がします。

What’s new in SwiftUI

developer.apple.com

タイトルどおり、今年の SwiftUI のアップデートについて全体的に解説されたセッションです。

新しく追加された .swipeAction)

リストの交互色分け

macOS でサポートされた Table

CoreData との連携

SF Symbols に追加された2つのレンダリングモード

コンテキストに応じて変化するバリアント

Canvas によるグラフィック描画

時間変化で更新される TimelineView

スクロールの上部または下部に固定された View

AttributedString の利用

テキストを選択可能にする .textSelction)

Toggle でボタン形式のスタイルが利用可能に

ControlGroup によるグルーピング

まとめスレ:

https://twitter.com/tobi462/status/1526066278632681472

Add rich graphics to your SwiftUI app

developer.apple.com

新しく追加された Material 効果や、スクロールの上部・下部などに固定する safeAreaInsets、Canvas などについて解説されたセッション。

セーフエリアについての考え方

マテリアル効果を適用した例

4つのレベルが用意されている

Canvas の利用。Context はコピーするだけで独立する

Canvas は全プラットフォームに対応

まとめスレ: https://twitter.com/tobi462/status/1526368985704726528

Craft search experiences in SwiftUI

developer.apple.com

SwiftUI 向けの標準の検索の仕組みとして追加された searchable について解説されたセッション。

新しく追加された .searchable)

検索中かどうかは isSearching で取得できる

macOS アプリで利用した例

検索のコンプリーションにも対応

検索の決定は .onSubmit) で拾える

まとめスレ: https://twitter.com/tobi462/status/1526533841615065088

Direct and reflect focus in SwiftUI

developer.apple.com

SwiftUI に追加されたフォーカス制御の仕組みである @FocusState などについて解説されたセッション。

@FocusState の利用

一部のプラットフォームではフォーカス領域を定義できる

.focusSection) のコード例

まとめスレ: https://twitter.com/tobi462/status/1526344688059289600

Localize your SwiftUI app

developer.apple.com

ローカライズ文字列の Markdown サポートや、キーボードショートカットのローカライズ、Xcode に追加されたインポート・エクスポート機能などについて解説されたセッション。

文字列インターポレーションでもローカライズが機能する

Markdown がサポートされたローカライズ文字列

新しい Formatter API

Xcode からのインポート・エクスポートも強化された

まとめスレ: https://twitter.com/tobi462/status/1526564694131343361

Demystify SwiftUI

developer.apple.com

SwiftUI を支える技術要素である、アイデンティティ(ID)や依存グラフ、非活性モディファイア(Inert Modifier)などについて解説されたセッション。

View がどのように型付けされているか

View 更新の仕組みを支える依存グラフ

非活性モディファイア(Inert Modifier)を好むと良い

まとめスレ: https://twitter.com/tobi462/status/1526164872966602753

Discover concurrency in SwiftUI

developer.apple.com

SwiftUI で async/await や MainActor を使う方法や、AsyncImage や refreshable などの利用方法について解説されたセッション。SwiftUI における実行ループについての解説も前半で行われている。

実行ループと View 更新の仕組み

これらが順に呼ばれて初めて再描画される

async/await で非同期処理も簡単に記述できるように

task モディファイアによる非同期処理

AsyncImage の利用例

まとめスレ: https://twitter.com/tobi462/status/1527147027775488001

Bring Core Data concurrency to Swift and SwiftUI

developer.apple.com

async/await に対応した Core Data の API のアップデートや、SwiftUI との統合について解説されたセッション。

CoreData と SwiftUI の連携

CoreData でもサポートされた async/await

既存 API との対応関係

@FetchRequest の利用例

Section での分割処理にも対応

実際の利用例

まとめスレ: https://twitter.com/tobi462/status/1527498575022034944

Swift

Swift 関連の進化は Concurrency だけに留まりません。

Swift Package を素早く検索・追加できるように Xcode に追加された「Swift Package Collection」。標準ライブラリの不足を補う目的で開発・OSS 化された「Swift Algorithms」や「Swift Collctions」、「Swift System」。標準のドキュメントツールとして開発された「DocC」。ARC を含めたさらなるパフォーマンス改善。より柔軟な記述をサポートするようになった Swift 自体の改善。

あらためて見ると、Concurrency 以外にもかなりアップデートがあったことが分かります。

What‘s new in Swift

developer.apple.com

タイトルどおり、Swift 関連のアップデートについて全体的に解説されたセッション。

標準ライブラリを補うパッケージ

Swift Collections

Swift Algorithms

Swift System

標準のドキュメンテーションツールである DocC

Codable の強化

static メンバーに対して簡単にルックアップできるように

Property-wrapper がクロージャ引数でも利用可能に

async-let により構造化された並列処理

まとめスレ: https://twitter.com/tobi462/status/1527084211135729664

Discover and curate Swift Packages using Collections

developer.apple.com

新しく追加された Swift Package Collections について解説されたセッション。

Swift Package Collections でパッケージを探しやすく

デフォルトで含まれている Package

コマンドラインもサポート

コレクションの定義例

コマンドを利用した生成方法

生成されたコレクションを Xcode に追加

まとめスレ: https://twitter.com/tobi462/status/1527266415019200512

Meet DocC documentation in Xcode

developer.apple.com

DocC について、基本的な解説がされているセッション。

記事やチュートリアルも含められる

ドキュメント生成の仕組み

Xcode 上からドキュメントを生成する

ドキュメントの閲覧。検索やジャンプにも対応

ドキュメンテーションコメントの記述方法

インポートやエクスポートも可能

まとめスレ: https://twitter.com/tobi462/status/1528664970334175234

Meet the Swift Algorithms and Collections packages

developer.apple.com

標準 API に用意されているリスト操作系の API の解説から始まり、Swift Algorithms および Swift Collections について解説されたセッション。

Swift Algorithms に用意された大量の API

windows(ofCount:)

adjacentPairs()

chunks(ofCount:)

chunked(on: )

joined

Swift Collections

Dequeue

Unordered sets

Unordered dictionaries

まとめスレ: https://twitter.com/tobi462/status/1527266415019200512

ARC in Swift: Basics and beyond

developer.apple.com

ARC の基本や循環参照を解決するテクニックについての紹介、そして今年のアップデートである Xcode に搭載された ARC の改善についてのセッション。

有効期限はスコープではなく使用ベース

循環参照によるメモリリーク

withExtendedLifetime の利用

クラス構造を見直して循環参照を無くす

新しい Xcode のビルドオプション

まとめスレ: https://twitter.com/tobi462/status/1529622544818401280

Explore advanced project configuration in Xcode

developer.apple.com

Xcode で新しくサポートされた Multi-platform frameworks について解説されたセッション。しかし、後半は Xcode のビルド設定の詳細や、.xcconfig を利用した高度なビルド設定についても解説されている。

マルチプラットフォーム Framework がサポート

対応させる際のビルド設定

.xcconfig を利用した高度なビルド設定

まとめスレ: https://twitter.com/tobi462/status/1530325484252594177

Write a DSL in Swift using result builders

developer.apple.com

公式の言語機能になった Result builders を利用して DSL を設計・実装するという、一歩進んだ内容のセッション。

buildBlock の仕組み

buildOptional による if の処理

buildExpression で型を揃える

buildEither による条件分岐の処理

コンパイラでも利用されているエラーメッセージ改善の仕組み

まとめスレ: https://twitter.com/tobi462/status/1530136225465921536

周辺ツール

周辺ツールも色々と強化されています。

TestFlight では、macOS アプリの配布が可能になったり、複数の内部グループがサポートされるようになった他、Xcode Organizer との統合も強化されました。

また、macOS アプリ向けの公証サービスを利用するツールとして、altool に代わって新しく notarytool が提供されました。

Meet TestFlight on Mac

developer.apple.com

TestFlight で macOS アプリを配布する方法について解説されたセッション。複数の内部グループを活用する方法についても触れられている。

macOS サポートも追加された TestFlight

区別できるように黄色のドットが表示される

クラッシュ時はフィードバック情報も送信できる

TestFlight の内部チームの活用例

まとめスレ: https://twitter.com/tobi462/status/1529970214565482496

Triage TestFlight crashes in Xcode Organizer

developer.apple.com

TestFlight で配布したアプリのクラッシュを Xcode Organizer で効率的に調査・修正する方法について解説されたセッション。

Organizer から様々な情報にアクセスできる

リンクをコピーすることで共有することも

新しく追加された6つの機能

macOS サポートも追加された MetricKit

まとめスレ: https://twitter.com/tobi462/status/1529990369815175168

Faster and simpler notarization for Mac apps

developer.apple.com

macOS アプリ向けの公証サービスの概要や、altool に代わる新しいツールである notarytool について解説されたセッション。

公証サービスについて

公証サービスの全体ワークフロー

新しく開発された notarytool コマンド

コマンドで wait 出来るようになったので CI でも楽に

これまでの altool は非推奨に

まとめスレ: https://twitter.com/tobi462/status/1529610841372639232

テスト・メトリクス

ここ数年にわたり、毎年のように少しずつアップデートされている印象があるのが、テストとメトリクス関連です。

今年はテストでは”期待される失敗”(XCTExpectedFailure)が追加され、MetricKit も機能追加や改善が含まれています。

かなり個人的な印象値ですが、この年の WWDC でどちらも ほぼ完成したような印象 を受けており、何か機能に不足があると感じるケースは滅多になくなったのではないでしょうか。(たぶん

Embrace Expected Failures in XCTest

developer.apple.com

新しく追加された XCTExpectedFailure (期待される失敗)について解説されたセッション。

テストは投資

期待される失敗(XCTExpectedFailure)

実際の利用例

まとめスレ: https://twitter.com/tobi462/status/1530107909027557376

Ultimate application performance survival guide

developer.apple.com

パフォーマンス測定について順を追って解説されたセッション。MetricKit の新機能についても触れられている。

パフォーマンス改善に役立つツール郡

川を下るように順に見ていく

測定・改善ができる項目

MetricKit の利用方法

MetricKit の動作の仕組み

Organizer で収集した情報を確認できる

Instruments でのメモリリーク検証

まとめスレ: https://twitter.com/tobi462/status/1531057746321489922

おわりに

そんなわけで、私が視聴した WWDC 21 のセッションを振り返ってみました。

あらためて、 開発者向けのアップデートが大量にあった年 だったと思います。まだ、視聴できていないセッションもあるので、これからも少しずつキャッチアップを進めていきたい思いです。

さて、まもなく開催される WWDC 22 ではどのような発表があるでしょうか。楽しみですね!