View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC25に戻る

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • Summary
  • トランスクリプト
  • コード
  • Swiftの新機能

    Swiftに関する最新情報を紹介します。生産性をさらに向上させるワークフローの改善や、基本的なプログラミングタスクで使用する最新のライブラリAPIについて説明します。また、ソフトウェアスタックのさまざまなレイヤーにわたるSwiftの導入例を紹介します。最後に、並行処理の使いやすさを向上させ、必要なときに優れたパフォーマンスを実現するための新しい言語機能について解説します。

    関連する章

    • 0:00 - Introduction & Agenda
    • 0:48 - swiftlang updates
    • 3:06 - Development workflow: Writing code
    • 4:40 - Development workflow: Building
    • 7:36 - Development workflow: Debugging
    • 9:14 - Libraries: Subprocess
    • 10:45 - Libraries: Foundation
    • 12:31 - Libraries: Observation
    • 14:13 - Libraries: Testing
    • 16:08 - Swift throughout the stack: Embedded Swift
    • 18:00 - Swift throughout the stack: Security
    • 19:37 - Swift throughout the stack: Server
    • 23:23 - Swift throughout the stack: Platforms
    • 26:11 - Language evolution: Performance
    • 30:28 - Language evolution: Concurrency
    • 37:15 - Wrap up

    リソース

    • The Swift Programming Language
    • The Swift website
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • C、C++、Swiftを安全に併用する方法
    • Code Along:Swiftの並行処理によるアプリの強化
    • Containerizationの紹介
    • SwiftとJavaの相互運用性の詳細
    • Swiftによるメモリ使用量とパフォーマンスの向上
    • Swiftの並行処理の活用

    WWDC24

    • 明示的にビルドされたモジュールについて
    • Embedded Swiftでサイズを縮小
    • Swiftのパフォーマンスの詳細
  • このビデオを検索

    「What’s New in Swift」へようこそ Hollyです Allanです このセッションでは Swift 6.2の 新機能と改善点を紹介します これらのアップデートの目的は どのようなコードをどこで書くかに関わらず Swiftプログラマーの生産性を 向上させることです 最初に コードの記述、ビルド、デバッグの ワークフローの改善点についてお話しします 次に基本的なプログラミングタスクのための ライブラリ関連の新しいAPIを紹介します またソフトウェアスタックの すべてのレイヤーに Swiftを導入する方法を説明します 最後は 新しい言語機能の紹介です これは 並行処理の利用をより容易にし 最高のパフォーマンスを 必要時に発揮できるよう支援する機能です 今回カバーする改善点はすべて オープンソースで共同開発されました GitHubのswiftlang Organizationは 50プロジェクトを超えるほどに拡大し コンパイラ、swift.orgのWebサイト、 Foundation、テストライブラリや その他の重要コンポーネントが 広範なエコシステムを支えています swiftlangへのプロジェクト移行のほかにも Swift Buildという オープンソースの Xcodeのビルドシステムがあります Swift Buildは Appleの各OSのビルドプロセスも サポートしています Swift Package Managerの 低レベルのビルドシステムとして Swift Buildを採用するための 取り組みが オープンソースで進行中です これにより Xcodeとswift.orgの ツールチェーン間で ビルドエンジンが統一されます Swift Buildの詳細については ブログ記事「The Next Chapter in Swift Build Technologies」をお読みください swiftlangの最新プロジェクトの1つとして Swiftlyという バージョンマネージャーの開発があります Swiftlyの開発は元々 オープンソースコミュニティ内で SwiftツールチェーンのLinux上での管理の 効率化のために進められていました Swiftlyは現在macOSをサポートしており 1.0のリリースをswift.orgで入手可能です 最新のSwiftツールチェーンを 1つのコマンドのみでインストールできます またはGitHubブランチから 毎夜作成されるスナップショットを インストールして 開発中の 言語機能を試してみることもできます Xcodeでは Swiftlyで取得したツールチェーンは メニューから利用できます なお アプリをビルドしている場合 App Storeにアプリを提出するには Xcodeツールチェーンの使用が必要です VS Codeでは Swiftlyで インストールしたツールチェーンは Toolchainコマンドで選択できます Swiftly 1.0の詳細は Swiftブログでご確認いただけます Swiftを円滑に使い始めるための 改善点は ツールのインストールに関するものに 留まりません swift.orgのホームページの外観が刷新され アプリ、クラウドサービス、 埋め込みシステムなどの各領域を 詳細に調べやすいように 重点構成が変更されています これは Swift Website Workgroupとの 協働のもと実施されました Swiftを これまで以上に手軽に 使い始められるようになっています 次に デベロッパの皆さんにとって より優れた開発環境を構築するための Swift 6.2における柔軟性の強化について Allanが解説します ありがとう Holly Swiftの今年のリリースでは デベロッパのワークフローが 様々な面で向上しています Swiftコードの記述方法に関わらず メリットを得ることができます これらの機能強化は コードの記述、ビルド、デバッグなど 幅広いワークフローをカバーしています まずは今年の新機能が VS Codeでの開発にどう影響するか 見てみましょう

    VS Codeのマーケットプレイスで 提供されているSwift拡張機能が swift.orgによって公式に検証され 現在配信されています この拡張機能には ここ数年で いくつかの新機能も追加されています 1つ目は バックグラウンドでの インデックス作成です Swift 6.1では Swift PMプロジェクト用の デフォルト機能として バックグラウンドでの インデックス作成を VS Codeおよび 他のIDEに追加しました これにより Jump to Definitionなどの エディタ機能を使用して プロジェクトに変更を加えた際も 最新の状態を維持できます VS Codeのコード補完は より関連性の高い 結果を返すようになりました これはSourceKit-LSPの 向上のおかげです デバッグもよりシンプルになりました Swift拡張機能をインストールすると LLDBのサポートも自動追加されます 拡張機能の最新バージョンは 新しいプロジェクトパネルも備えています パッケージの依存関係、ターゲット、 タスクをより簡単に把握できます 最後に VS Code用のSwift拡張機能に プロジェクトのドキュメントの 新しい表示方法も追加されています コードの横に並べて DocCのプレビューを表示できます プレビューは入力に応じて更新されます VS Code用のSwift拡張機能は オープンソースで開発されており GitHubのswiftlang Organizationから 入手できます 次は Swiftコードのビルドに関する 様々な領域の改善点について お話しします 生産性に関して重要となる要素の1つが ツールのパフォーマンスです

    Swift 6.2では マクロベースのAPIを使用する プロジェクトでの クリーンビルドの 所要時間が大幅に短縮されています 例として 「Stringify」という 架空のパッケージのマクロを利用する プロジェクトがあるとします 従来 プロジェクトのビルドでは Swift PMはまず マクロが利用する ライブラリであるswift-syntaxの ソースを取得する必要がありました 次に swift-syntaxと Stringifyマクロプラグインをビルドし 最後にコードをビルドしました swift-syntaxのビルドは キャッシュ可能でしたが クリーンビルドを実行するには 長時間を要していました これは特に 継続的インテグレーション環境で顕著でした Swift PMとXcodeの最新リリースでは ビルドを高速化するために 事前ビルド済みの swift-syntaxの 依存関係をサポートしています これにより 時間のかかる ビルドのステップが完全に不要になり 一部のプロジェクトでは数分単位で クリーンビルドの時間が短縮されます

    マクロを提供するパッケージがある場合 swift-syntaxのタグ付きリリースに依存する パッケージがあれば クライアントはこの最適化を利用できます しかし 生産性に影響するのは必ずしも ビルドのパフォーマンスだけではありません コンパイラが特定した問題の解決に 時間がかかることもあります 例えば Swift 6の言語モードで 並行処理コードを記述する場合 コンパイラが 回避すべき潜在的な データ競合を検出することがあります ここで検出されたエラーは 重要なものかもしれませんが その解決方法が明らかであるとは 限りません そのため Swift 6.2では 診断のカテゴリを幅広くカバーできるよう ドキュメントの拡張に着手しています 一般的な警告やエラーの説明を より広範に提供することで 問題の理解と 具体的な解決方法の特定を促進します ドキュメントには お使いのIDEか swift.orgからアクセスできます 診断の動作を制御できることも重要です 例えば コード記述時に 警告が出ないようにするために 「warnings as errors」の設定を 使う方もおられるでしょう これは 警告が簡単に解決できる ものである場合は有効ですが 非推奨のAPIに関するものなど 一部の警告では すぐに解決することを強制されるのが 煩わしい場合もあります Swift 6.2では どの警告を エラーとして扱うかを 柔軟に選択できます 例えば すべての警告を デフォルトでエラーとして扱いつつ 非推奨の宣言だけは例外とするよう 設定できます あるいは 特定のカテゴリの警告のみに対し 予防措置を取りたい場合 それらの警告を エラーに昇格させるだけでOKです コンパイラの警告の制御の向上は すべてのデベロッパにとって Swiftを使いやすくするための コミュニティの尽力を表す好例です 提案の作成者および フォーラムでの議論に参加したすべての方に この場を借りてお礼申し上げます 最後に Swift 6.2における デバッグ関連の優れた改善点を紹介します

    このリリースでは 非同期コードのデバッグの体験が 大幅に向上しました Swiftタスクで実行されているコードを ステップごとに デバッグしていく際 LLDBが 非同期関数の実行の追跡において スレッド間の切り替えが必要な場合でも 追跡できるようになりました デバッガが Swiftの タスク中心のモデルを理解しているため どのタスクが実行中か示すことができます さらに タスクに名前を付けて より特定しやすくすることも可能です タスク名は Instrumentsの 並行処理テンプレートに記録される Instrumentsプロファイルにも 表示されます swift task infoなどの 新しいコマンドを使用して 現在実行中のタスクについて 優先度や子タスクなどに関する より多くの情報を得ることもできます 最後に デバッグセッションの応答性も 今年のリリースで向上しています これは モジュールの依存関係の構築時に 並列処理と再利用を可能にする 明示的にビルドされたモジュールという ビルドシステムの機能によるものです 明示的にビルドされたモジュールの登場前は Xcodeのビルドとデバッガは 完全に別個の モジュールグラフを使用していました 現在では デバッガは ビルドのモジュールを再利用できます そのため デバッガで初めて pやpoのコマンドを実行する際 これらによる評価が大幅に高速化します 型情報が即座に得られるからです 明示的にビルドされたモジュールは Xcode 26ではデフォルトで有効です 以上 Swiftに今年追加された ツールの改善点の一部をご紹介しました 次は私から 皆さんが日々使用する Swiftのコアライブラリに関する 重要なアップデートについてお話しします ライブラリは あらゆる種類のタスクで役立ちます Swiftのコアライブラリは Swiftコードを記述する上で不可欠な 構成要素を提供します Swift 6.2は FoundationのAPIサーフェスを より広範にモダナイズするほか 日々のプログラミングタスクを効率化する 新しいAPIを提供します スクリプト記述タスクでの Swiftの使用体験を向上させるために Foundation Workgroupは サブプロセスを開始するためのAPIを含む 新しいパッケージを導入しました まずは新しいSubprocessパッケージを 追加およびインポートします 次に run関数を呼び出して結果を待つ サブプロセスを開始します プロセス名を含む文字列を入力すると runメソッドが $PATH環境変数に基づき 実行可能ファイルを検索します

    多くの場合 サブプロセスの開始には FilePathを使用して 実行可能ファイルのパス全体を指定します サブプロセスが終了すると 終了ステータス、standardOutput、 プロセス実行に関するその他の情報を 調べることができます このサブプロセスライブラリには さらに多くの機能があり プロセスの実行に対するきめ細かい制御や 各プラットフォームに固有の 構成オプションなどを利用できます swift-subprocessリポジトリで すべてのAPIサーフェスを確認できます パッケージは現在バージョン1.0であり デベロッパからのフィードバックは バージョン1.0でリリースされたAPIに 有益な情報となります Foundation Workgroupは アプリプロジェクトで日常的に使用される 一般的なAPIにも機能強化を行いました UIKitからの通知への応答は iOSアプリで非常によく使用されますが 通知を監視するためのコードでは ミスが生じがちです まず オブジェクトが投稿をサポートする 通知の名前を登録する際に注意が必要です ここでミスすると 通知のコールバックは実行されません 通知に関する情報は 型指定のない辞書に格納されます ここでは 正しいキーを使用して 手動で登録を行い 結果を正しい型へと 動的キャストする必要があります また 通知がメインスレッドに 投稿されることが確証された場合でも MainActorのAPIへのアクセスで 並行処理のエラーが出ることがあります 通知の名前とペイロードが 具象型をサポートするようになりました 具象型では 登録する通知の種類を オブジェクトがサポートしているかを コンパイラがチェックできます また 通知のペイロードに関する記述で 定型表現が不要になります 通知の型により通知の投稿先が指定されます 通知がMainActorに投稿されている場合 MainActorのAPIに 自由にアクセスできます MainActorMessageに適合させると 通知が常にメインスレッド上で 同期的に投稿されることが確証されます 一方 AsyncMessageに適合させると 通知は任意のスレッドに 非同期的に投稿されます 通知の具象型はSDKで利用可能であり UIKitやFoundationなどの フレームワークで投稿される 通知に適用できます 通知の具象型は 皆さん独自の通知にも 追加できます 登録済みのオブザーバへの システム通知のブロードキャスト配信は より一般的な オブザーバパターンに基づきます オブザベーションライブラリは オブジェクトグラフの状態変更を 自動トラッキングするための 汎用APIを提供します

    クラスを監視トラッキングの 対象として指定するには @Observableマクロを使用します Swift 6.2では 監視可能な型から AsyncSequenceによって状態の変化を ストリーミングする方法が導入されます まず Observations型の 新規のインスタンスを クロージャを使って作成します このクロージャ内で 変更を監視する対象の値を計算します ここでは プレーヤーの現在の状態を説明する 文字列を監視し スコアが更新されるか プレーヤーが新規アイテムを入手するたびに 新しい値を取得するようにします クロージャ内で使用されている 監視可能なプロパティに基づき 更新された値を取得します 更新はトランザクションとして発生します 更新のトラッキングの開始は クロージャ内の監視可能なプロパティの いずれかでwillSetが呼び出された時です トラッキングは コードが一時停止する 次のawaitで終了します 更新された値には コードにおける トラッキング開始と終了の 2点間で発生した 同期された変更がすべて含まれます これにより 複数のプロパティでの 同期された更新によって オブジェクトの状態が不整合になる 監視のアップデートが引き起こされません

    スコアとアイテムの両方を 同期させて更新した場合 取得するのは 両方の変更を含む 更新された値1つのみです Observations型は AsyncSequenceに適合しているので for-awaitループを使用して 更新された値を反復処理できます デベロッパは毎日テストを記述します Swift Testingは クロスプラットフォームのライブラリです テストを記述し整理するための マクロを提供します 例えば テスト機能を宣言する @Test属性のようなマクロです expectとrequireのマクロを使って 仮定を検証し 期待や要求に失敗した際に Swift Testingで 実用的な情報を入手できます テストの失敗の優先順位付けが 難しいことがあります CIなどのリモート環境でのみ 失敗する場合は特にそうです テストの失敗を理解するには テストで使うデータについて より多くのコンテキストが必要です

    Swift 6.2にはテスト失敗の診断に役立つ カスタム添付ファイルが導入されています Attachment.recordメソッドを呼び出して テストに添付ファイルを追加できます DataやStringなどの ライブラリ型を添付できるほか 添付可能なプロトコルに従って 独自の型について 添付ファイルのサポートを実装できます Swift 6.2は終了テストもサポートし 特定の状況で終了するよう コードをテストできます 例えば必要条件に従って 入力パラメータに関する 仮定を検証する関数を書く場合 必要条件が失敗したときに成功する テストケースを記述できます

    processExitsWithという引数を #expectや#requireに渡し 終了テストを作成します 終了テストを作成する場合 Swift Testingは新しいプロセスを開始し テストを実行して 特定の終了コード、シグナル、 失敗ステータスにより プロセスが終了するかどうかを検証できます これらの汎用ライブラリを使用すると アプリコード以外でもプロジェクト全体で ポータブルなSwiftコードを作成し テストできます Appleはソフトウェアスタック全体で Swiftを使っています ファームウェア、アプリ、フレームワーク、 大規模なWebサービスに使います 組み込みデバイス、セキュリティ クリティカルなコンポーネント、 サーバ向けにコードを書く際は Swift 6.2の機能強化が役立ちます いくつかの新しいプラットフォームを ターゲットにすることもできます Embedded Swiftがある スタックの一番下から始めましょう Embedded SwiftはSwiftのサブセットで 制約の多い環境をターゲットにして コードを書けます 組み込みデバイスのファームウェアや OSのカーネルなどです Swiftのコア機能をサポートする コンパイルモードで 値、参照タイプ、クロージャ、オプション、 エラー処理、ジェネリックなどがあります AppleはiPhoneに搭載されている 一部の下位のソフトウェアで Embedded Swiftを使っています 例えば iOS 26のEmbedded Swiftは コプロセッサーを実行して CPUとGPU間の 共有メモリページへのアクセスを管理します Embedded Swiftを試してみたい方は 「Go small with Embedded Swift」を ご確認ください Swift 6.2ではEmbedded Swiftに 新しい機能が追加され 文字列補間を含む Swiftの完全な文字列APIに対応しました Swiftのany型はプロトコルに適合した 型の値を表すことができ プロトコルがクラス型に 制限されている場合に 利用できます Swiftの標準ライブラリに追加される InlineArrayとSpanは メモリ領域を効率化する新しい2つのAPIです Hollyが後で詳しく説明する これらのタイプは 組み込みプログラムによくみられる パフォーマンスが重要なコードに最適です Embedded Swiftの機能が高まるにつれて コミュニティは活況を呈し 組み込みプロジェクトに使える例が 様々に作成されてきました GitHubのswift-embedded-examples リポジトリでご確認ください Embedded Swiftのメリットの1つは デフォルトでメモリセーフな言語で 下位のソフトウェアを書けることです メモリセーフなコードはより安全であり 私たちはSwiftをさらに向上させ 強力なセキュリティ要件を持つコードに 対応できるように取り組んできました 本質的な安全性のないものを 仕上げるために コードが必要になることもあります たとえばCで書かれた 依存関係と統合する場合 ポインタを取るAPIを使うことが一般的です セキュリティクリティカルな状況では 安全でないコードはなるべく避けましょう 避けられない場合は 簡単に識別できるようにしておきます そこでSwift 6.2に 厳格なメモリ安全性という オプトイン機能を導入しました このモードでは 安全でないAPIの使用はすべて ソースコードに明示的な承認が必要です このモードには注釈が必要で コードのどの部分に セキュリティ的に 注意が必要かを特定できます この新しいモードに加えて Swift 6.2はCとC++ヘッダーの 新しい注釈にも対応しており Spanなどの安全で 人間工学に基づいた型を使って APIをSwiftにインポートします 新しい相互運用機能について詳しくは 「Safely mix C, C++, and Swift」を ご確認ください AppleのOSでは セキュリティクリティカルな2つの要素に 厳格なメモリ安全性を導入し WebKitとメッセージアプリのサブシステムで 受信したメッセージと 添付ファイルを分析します これらは信頼性の低い入力を処理するので 安全でないAPIの使用を制限するうえで この機能は特に重要です では サーバエコシステムでの Swiftの利用方法を確認しましょう

    SwiftはAppleのサービスに 大きな役割を果たしています Swiftを活用したバックエンドサービスが 毎秒大量のリクエストを 処理しています これらのサービスの1つに データが漏えいし パスワードが侵害された場合に ユーザーに警告するものがあります これは以前Javaで構築していましたが 最近Swiftで書き直したことで 大きなメリットが生まれました Swiftの効率的なネイティブコードと 確定的なメモリ管理により サービスのスループットが40%向上し ハードウェア要件が半分になりました

    サーバにSwiftを利用することは 多くの方にとって有益でしょう 例えば Cultured Codeのエンジニアは Things Cloudという 有名なThingsアプリのバックエンドを Swiftで再実装し その体験をswift.orgで語りました

    Things CloudでSwiftを使用すると コンピューティングコストが 1/3に削減され 平均応答時間が400%向上しました パフォーマンスの向上に加え Swiftを利用するもう1つのメリットは 同じ言語とツールを使って クライアントとサーバを 開発できることです Swiftでサーバのバックエンドを 構築するうえで重要なのが ライブラリです Swiftのパッケージエコシステムは 基本的なユースケースを 幅広くカバーしています ライブラリはネットワーク、 データベースドライバ、 可観測性、メッセージストリーミング などがあります 今年の大きなアップデートは gRPC Swiftバージョン2のリリースです gRPCはサービスAPIを構築する 最新で高パフォーマンスのパッケージです バージョン2の特徴は モダナイズされたAPIで Swift Concurrency、 イディオマティックなSwiftコード、 プラグイン可能で高パフォーマンスの トランスポート層を活用します gRPC Swiftの保守担当者がswift.orgに アップデートに関する記事を書いています ぜひご確認ください C、Objective-C、C++との相互運用性は Swiftの大きな強みです これらの言語で書いた既存のコードベースを Swiftを利用することで 段階的に向上させることができます サーバエコシステムでは 多くの既存アプリがJavaで書かれています これらのコードベースでも Swiftの段階的な利用が 大きな効果を発揮すると思います 昨年 swift-javaという刺激的な 新規オープンソースプロジェクトを 発表しました 言語のシームレスな相互運用が目的です

    swift-javaではバインディングを作成して Swiftコードと Javaが呼び出し合えるようにします これらのバインディングは 過度なオーバーヘッドなく 各言語の値のネイティブ表現を ラップします JavaのSwift向けバインディングは Javaの次世代の 他言語インターフェイス技術を活用し 必要に応じてJNIにフォールバックします Swift-Javaプロジェクトは現在 実験段階にあり急速に進化しています この仕組みについて詳しくは 「Explore Swift and Java interoperability」をご確認ください

    クライアントとサーバを両方持つ アプリを実行する場合 ローカルで両環境のコードをテストする ワークフローが必要です Appleは新たにオープンソースの コンテナ化ライブラリをリリースします Macで動作する Linuxコンテナを ベースにしたツールの作成に 利用できるライブラリです ライブラリはSwiftに完全実装され セキュリティやプライバシーや パフォーマンス重視で設計してあります Swiftを使ったシステムレベルの開発で 威力を発揮してくれます ライブラリの詳細は 「Meet Containerization」で紹介しています GitHubのコンテナ化リポジトリでは コンテナ実行用の コマンドラインバイナリもご覧いただけます 最後に Swiftで対応可能な プラットフォームの最新情報です Swift 6.2は サーバや 埋め込みプラットフォームで普及している オペレーティングシステム FreeBSDに正式対応します Swiftは他にも WebAssembly いわゆる「Wasm」にも対応します WebAssemblyはポータビリティや セキュリティやハイパフォーマンス重視の 仮想マシンプラットフォームです デベロッパはクライアントとサーバ 両方のWasmアプリをビルドして ブラウザや他のランタイムに デプロイできます WebAssemblyサポートの端緒は コミュニティプロジェクトでした 今年に入って Swiftでの WebAssembly正式サポートの 展望に関する文書が公開され プロジェクトは大きな節目を迎えました Wasm対応の具体例を紹介します ファイルから3Dモデルを読み込んで ブラウザで レンダリングするアプリを Swiftで作成しました アプリは現在 こういう状態です

    Wasm仮想マシンで動作しています Swiftロゴは 実験段階のWeb標準 「WebGPU」でレンダリングしています

    アプリにはJavascriptKitという SwiftWasm Organizationが開発した オープンソースパッケージを使います ライブラリを利用すれば ネイティブのSwift API経由で Javascriptランタイムを操作できます 最終的なバイナリを 極力コンパクトにするため Embedded Swiftを使って アプリをコンパイルしますが このコードの大部分は ノーマルなSwiftコードです

    例えば ジェネリクスを使った ジオメトリユーティリティを追加して Wavefrontファイルのパーサーは SwiftネイティブのString APIを使います

    動きを加えてみましょう レンダラーのupdateメソッドに移動します

    モデルをスピンさせるには フレーム単位で ロゴの回転を 更新する必要があります

    テストしてみます アプリを再実行するため Project Panelからタスクをトリガーします Swift Buildを呼び出してWasmアプリを コンパイルするよう構成してあります ビルド出力で最小化ツールを実行して バイナリを極力小さくします 最後に Webサーバを起動して コンテンツをホストさせます 上出来ですね ソフトウェアスタック全般で Swiftが選ばれているのは 言語として優れているからです Swiftはデフォルトで 安全性と使いやすさを重視しつつ 上級プログラマー向けのツールも 用意しており 複雑なコーディングやパフォーマンスの 最大化にも対応できます 言語の機能については 使いながら学んでいけます 簡単なタスクから始めて 慣れてきたら より高度な機能に手を広げられます

    Swift 6.2の言語は 初心者から上級者まで 誰でも使いやすいように進化しました プロジェクト内での並行処理によって 一段と敷居が低くなりました パフォーマンス重視のコードを手がける 上級者のニーズにも 十分応えられる言語になっています パフォーマンスのアップデートから ご紹介します Array型は要素の順序付きリストであり Swiftプロジェクトで最も一般的に 使用されるデータ型の1つです 動的なサイズ変更など 使いやすい機能が備わっているArrayは 多数のタスクに適しています ただし この柔軟性には代償が伴います 動的なサイズ変更をサポートするため Arrayは ヒープ割り当てバッファへの 参照を格納します 多数の要素が追加されて Arrayがいっぱいになると 新しいメモリが動的に割り当てられ 既存の要素がコピーされます Arrayをホットパスで使用する パフォーマンス重視の コードを記述する場合 Arrayバッファでは メモリの割り当て または参照を削除する必要が あることに気づくと思います Arrayのサイズが変わらない場合 ヒープ割り当てのコストは 発生しません InlineArrayは 要素用のインラインストレージを備えた 新しい固定サイズのArray型です サイズはこの型の一部であり Element型の 前に山括弧で囲んで記述されます

    要素を含むバッファへの参照を 格納する代わりに InlineArrayの要素が直接格納されます つまり これらの要素は 追加のヒープを割り当てなくても スタック上に格納するか または他の型内に格納できます InlineArrayには コピー可能および コピー不可能な型を格納できます コピー可能な型を格納する場合 InlineArray自体がコピーされ さらに要素の値がコピーされます 型の一部としてサイズを記述するには 型パラメータとして整数を指定できる 新しいジェネリック機能を使用します Element型と同様 InlineArrayのサイズも 配列リテラルによって示されます InlineArrayをと記述した場合 この型は<3, int>の InlineArrayとみなされます コンパイル時に InlineArrayのサイズがわかれば インデックスがそのサイズより小さい場合に 境界チェックを削除するなど より詳細な最適化が可能になります Container型は 基盤となるストレージへの 直接アクセスを提供する必要があります これは 連続メモリで ローカル処理を実行する場合に便利です 元のコンテナのレイアウトを 把握している必要がありません 例えば 関数で ArrayまたはInlineArrayの連続ストレージを 直接操作したい場合があります Swift 6.2より前の一般的な解決策は 安全でないポインタに ドロップダウンすることでした 効率的ですが 基本的に安全ではなく ミスも発生しやすくなります

    新しいSpan型は抽象型です メモリの安全性を損なうことなく 連続するメモリに 高速かつ直接的にアクセスできます 標準ライブラリは 連続ストレージを使用する すべてのContainer型に Spanプロパティを提供します ストレージの対象はArray、ArraySlice、 InlineArrayなどの要素です

    このプロパティは Spanの使用中は 連続メモリの有効性を維持することで メモリの安全性を保証します これらの保証により Use-After-Freeや変更の重複など メモリの安全性に関する ポインタに固有の問題が 特定されます これらは 実行時オーバーヘッドなしで コンパイル時にチェックされます 例えば 元のコンテナを変更すると その後は同じSpanに アクセスできなくなります 変更後は Span変数に 再びアクセスできません

    さらにSpanは 元のコンテナより 長く存続できません これは寿命依存と呼ばれ Spanからまだアクセス可能な時に 基盤となるストレージが 破壊されないようにします InlineArrayとSpanを使って パフォーマンスを管理する 新しい方法については 「Improve memory usage and performance with Swift」をご視聴ください Swiftコードの パフォーマンス特性について詳しくは 「Explore Swift performance」をご覧ください

    パフォーマンスの もう1つの側面は応答性です プログラムは複数のタスクを 同時に実行する必要があります 並行プログラミングは簡単ではありません 複数のタスク間でメモリを 共有すると エラーが生じやすくなり 予測できない動作につながります Swift 6のデータ競合の安全性により これらのエラーが コンパイル時に検出されるため 並行コードを記述する際 デバッグが 難しい実行時エラーを回避できます とはいえ 多くの場合 記述するほとんどのコードは データ競合が発生しやすく コンパイラエラーにつながるため 対処する必要があります このPhotoProcessorクラスのように ミュータブルな状態を持つクラスは 同時にアクセスしない限り 安全です 指定されたイメージデータの 被写体を計算することによって ステッカーを抽出する 非同期メソッドがあります しかし MainActorで extractStickerを UIコードから呼び出そうとすると データ競合の原因となるエラーが発生します この言語では コードの並列実行が不要な場合でも 暗黙的に処理をバックグラウンドに オフロードするケースがあるためです

    Swift 6.2では この考え方が見直され 並行処理の導入を選択しない限り デフォルトでは シングルスレッドで動作します

    Swift 6.2での言語変更により デフォルトでは 記述するほとんどの 自然コードでデータ競合が発生しません そのため プロジェクトに 並行処理を導入しやすくなります コードを並行実行するために 並行処理の導入を選択した場合は データ競合の安全性により保護されます まず ミュータブル状態を使用する型での 非同期関数の呼び出しを簡単にしました 特定のアクターに結び付けられていない 非同期関数をオフロードする代わりに この関数は 呼び出し元の アクターでの実行を継続します 非同期関数に渡される値は アクター外に送られることがないため データ競合が排除されます それぞれの実装で 非同期関数は 処理オフロードできますが クライアントはミュータブル状態について 心配する必要がありません

    次に MainActor型での 適合性の実装が簡単になりました ここでは「Exportable」という プロトコルを使用します MainActorのStickerModelクラスに 適合性を実装しましょう エクスポート要件には アクター分離がありません MainActorからの呼び出しが可能であり StickerModelがその実装で MainActorの状態を 使用しないことを前提としています

    Swift 6.2は これらの適合性をサポートしています MainActor状態を必要とする適合性は 「isolated」と呼ばれます MainActorの適合性は MainActorでのみ使用されるため 安全性を確保できます MainActorにとどまることを条件に Exportableアイテムの配列に StickerModelを追加する ImageExporter型を作成できます ただし ImageExporterをどこからでも 使用できるようにした場合は StickerModelを配列に追加できません StickerModelでのエクスポートを MainActor外から呼び出す処理は 安全でないためです コードで適合性の同時使用が必要な場合 isolated適合性を使用すれば データ競合の安全性の問題を 解決するだけで済みます

    グローバル変数と静的変数の場合 どこからでもミュータブル状態に アクセスできるため データ競合が発生しやすくなります

    グローバル状態を保護する 最も一般的な方法はMainActorです 一般に 同時タスクが あまり多くないプロジェクトでは特に MainActorを使用してクラス全体に 注釈を付け すべてのミュータブル状態を保護します 完全にシングルスレッドの プログラムをモデル化するには プロジェクトのすべての箇所に @MainActorを記述します シングルスレッドコードのモデリングを より簡単にするため デフォルトでMainActorを推測する モードを導入しました MainActorはすべてのミュータブル状態を デフォルトで保護するので 安全でないグローバル/静的変数や その他のMainActor関数の 呼び出し(SDKなど)に伴うデータ競合の 安全性エラーをなくすことができます また ほとんどシングルスレッドの コードでの並行性注釈も削減されます このモードは 多くの処理をMainActorで 実行するプロジェクトに適しており 特定の型やファイル内に 並行コードがカプセル化されます オプトインであり アプリやスクリプトなどの 実行可能ターゲットに適しています CPU負荷の高いタスクの実行時に アプリの応答性を維持する場合などは 処理をバックグラウンドに オフロードすることも重要です PhotoProcessorでextractStickerメソッドを 実装する方法を見てみましょう まず イメージのステッカーを 既に抽出しているかどうかをチェックして キャッシュ済みステッカーを 即座に返せるようにします ステッカーがキャッシュされていない場合は イメージデータから被写体を抽出して 新しいステッカーを作成します extractSubjectメソッドが負荷の高い イメージ処理を実行するので MainActorやその他のアクターを ブロックしたくありません @concurrent属性を使用して この処理をオフロードできます @Concurrentは 常に同時スレッドプールで 関数が実行されることを保証し アクターが複数のタスクを 同時に実行できるようにします これらの言語変更の連係により 並行処理が使いやすくなります まず デフォルトでMainActorで 実行されるコードを記述します ここではデータ競合のリスクがありません 非同期関数の使用を開始すると それらの関数は 呼び出された場所で実行されます この場合も すべてのコードは MainActorで実行されるため データ競合のリスクはありません パフォーマンスを向上させるために 並行処理を取り入れる準備ができたら 特定のコードをバックグラウンドに オフロードして 並行して実行します 並行処理を実際に 使用する方法について詳しくは 「Elevate an App with Swift concurrency」をご覧ください. 並行処理機能の基本的な概念については 「Embracing Swift Concurrency」を ご視聴ください 一部の言語変更は 実装にあたって プロジェクトでの変更が必要なため オプトインとなっています 利用可能な並行処理の 言語変更は いずれもXcodeビルド設定の 「Swift Compiler - Concurrency」 セクションにあります Swiftパッケージのマニフェストファイルで SwiftSettings APIを使用して これらの機能を有効にすることもできます Swift 6.2の移行ツールを使用すると 必要なコード変更を 自動的に行うことができます 移行ツールの詳細については swift.org/migrationをご覧ください これらの並行処理は プロジェクトでの安全なデータ利用に関する フィードバックに基づいて強化されました 皆さんから報告されたバグ、 並行処理の問題に関するご質問、 フォーラムでの革新的な提案、 皆さんの手による言語変更や ご意見などが反映されています 並行処理の使いやすさ向上に ご協力いただきありがとうございました Swiftの強化に関心がございましたら swift.orgのフォーラムにご参加ください Swift言語とエコシステムの 向上にもぜひご協力ください コミュニティのショーケースセクションで 皆さんのプロジェクトを ご紹介いただけるのを楽しみにしています Swiftフォーラムでは カンファレンス、交流会、 ソーシャルメディアなど Swiftに関する様々な 最新情報を入手できます 本日はありがとうございました フォーラムでお会いしましょう

    • 9:44 - Subprocess: Call `run` with string

      import Subprocess
      
      let result = try await run(
        .name("pwd")
      )
    • 10:04 - Subprocess: Call `run` with file path

      import Subprocess
      
      let swiftPath = FilePath("/usr/bin/swift")
      let result = try await run(
        .path(swiftPath),
        arguments: ["--version"]
      )
    • 10:05 - Subprocess: Accessing standard output

      import Subprocess
      
      let swiftPath = FilePath("/usr/bin/swift")
      let result = try await run(
        .path(swiftPath),
        arguments: ["--version"]
      )
      
      let swiftVersion = result.standardOutput
    • 10:51 - NotificationCenter: Dynamic types

      import UIKit
      
      @MainActor 
      class KeyboardObserver {
       func registerObserver(screen: UIScreen) {
          let center = NotificationCenter.default
          let token = center.addObserver(
            forName: UIResponder.keyboardWillShowNotification,
            object: screen,
            queue: .main
          ) { notification in
            guard let userInfo = notification.userInfo else { return }
            let startFrame = userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect
            let endFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
      
            guard let startFrame, let endFrame else { return }
      
            self.keyboardWillShow(startFrame: startFrame, endFrame: endFrame)
          }
        }
        
        func keyboardWillShow(startFrame: CGRect, endFrame: CGRect) {}
      }
    • 11:34 - NotificationCenter: Concrete types

      import UIKit
      
      @MainActor
      class KeyboardObserver {
        func registerObserver(screen: UIScreen) {
          let center = NotificationCenter.default
          let token = center.addObserver(
            of: screen,
            for: .keyboardWillShow
          ) { keyboardState in
            let startFrame = keyboardState.startFrame
            let endFrame = keyboardState.endFrame
      
            self.keyboardWillShow(startFrame: startFrame, endFrame: endFrame) 
          }
        }
        
        func keyboardWillShow(startFrame: CGRect, endFrame: CGRect) {}
      }
    • 12:01 - NotificationCenter: Conformances

      extension UIResponder { 
        public struct KeyboardWillShowMessage: NotificationCenter.MainActorMessage
      }
      
      extension HTTPCookieStorage {
        public struct CookiesChangedMessage: NotificationCenter.AsyncMessage
      }
    • 12:48 - Observation: The @Observable macro

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
    • 12:58 - Observation: The Observations type

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
    • 13:56 - Observation: Transactional updates

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
      
      player.score += 2
      player.item = .banana
    • 14:05 - Observation: AsyncSequence

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
      
      player.score += 2
      player.item = .banana
      
      for await value in values { print(value) }
    • 14:17 - Swift Testing

      import Testing
      import Foundation
      import EvolutionMetadataModel
      
      @Test
      func validateProposalID() async throws {
        let (data, _) = try await URLSession.shared.data(from: evolutionJSONMetadataURL)
      
        let jsonDecoder = JSONDecoder()
        let metadata = try jsonDecoder.decode(EvolutionMetadata.self, from: data)
        for proposal in metadata.proposals {
          #expect(proposal.id.starts(with: "SE"))
        }
      }
    • 14:54 - Swift Testing: Attachments

      import Testing
      import Foundation
      import EvolutionMetadataModel
      
      @Test
      func validateProposalID() async throws {
        let (data, _) = try await URLSession.shared.data(from: evolutionJSONMetadataURL) 
        Attachment.record(data, named: "evolution-metadata.json")
      
        let jsonDecoder = JSONDecoder()
        let metadata = try jsonDecoder.decode(EvolutionMetadata.self, from: data)
        for proposal in metadata.proposals {
          #expect(proposal.id.starts(with: "SE"))
        }
      }
    • 15:23 - Exit Tests: Preconditions

      extension Proposal {
        public var number: Int {
          let components = id.split(separator: "-")
          precondition(
            components.count == 2 && components[1].allSatisfy(\.isNumber),
            "Invalid proposal ID format \(id); expected SE-<Number>"
          )
      
          return Int(components[1])!
        }
      }
    • 15:34 - Exit Tests: processExitsWith argument

      import Testing
      import EvolutionMetadataModel
      
      @Test
      func invalidProposalPrefix() async throws {
        await #expect(processExitsWith: .failure) {
          let proposal = Proposal(id: "SE-NNNN")
          _ = proposal.number 
        }
      }
    • 31:06 - Concurrency: Async function error message

      class PhotoProcessor {
        func extractSticker(data: Data, with id: String?) async -> Sticker? {     }
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor = PhotoProcessor()
      
        func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
          guard let data = try await item.loadTransferable(type: Data.self) else {
            return nil
          }
      
          return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
        }
      }
    • 32:06 - Concurrency: Run async functions on the caller's actor

      // Run async functions on the caller's actor
      
      class PhotoProcessor {
        func extractSticker(data: Data, with id: String?) async -> Sticker? {}
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor = PhotoProcessor()
      
        func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
          guard let data = try await item.loadTransferable(type: Data.self) else {
            return nil
          }
      
          return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
        }
      }
    • 32:36 - Concurrency: Conformance error

      protocol Exportable {
        func export()
      }
      
      
      extension StickerModel: Exportable { // error: Conformance of 'StickerModel' to protocol 'Exportable' crosses into main actor-isolated code and can cause data races
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 33:04 - Concurrency: Isolated conformances

      // Isolated conformances
      
      protocol Exportable {
        func export()
      }
      
      
      extension StickerModel: @MainActor Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 33:20 - Concurrency: Isolated conformance use

      // Isolated conformances
      
      @MainActor
      struct ImageExporter {
        var items: [any Exportable]
      
        mutating func add(_ item: StickerModel) {
          items.append(item)
        }
      
        func exportAll() {
          for item in items {
            item.export()
          }
        }
      }
    • 33:31 - Concurrency: Isolated conformance error

      // Isolated conformances
      
      nonisolated
      struct ImageExporter {
        var items: [any Exportable]
      
        mutating func add(_ item: StickerModel) {
          items.append(item) // error: Main actor-isolated conformance of 'StickerModel' to 'Exportable' cannot be used in nonisolated context
        }
      
        func exportAll() {
          for item in items {
            item.export()
          }
        }
      }
    • 33:51 - Concurrency: Unsafe static variable

      final class StickerLibrary {
        static let shared: StickerLibrary = .init() // error: Static property 'shared' is not concurrency-safe because non-'Sendable' type 'StickerLibrary' may have shared mutable state
      }
    • 34:01 - Concurrency: Protecting static variables

      final class StickerLibrary {
        @MainActor
        static let shared: StickerLibrary = .init()
      }
    • 34:05 - Concurrency: Protecting classes

      @MainActor
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
    • 34:15 - Concurrency: A single-threaded program

      @MainActor
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor: PhotoProcessor
      
        var selection: [PhotosPickerItem]
      }
      
      extension StickerModel: @MainActor Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 34:22 - Concurrency: Mode to infer main actor by default

      // Mode to infer main actor by default
      
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
      
      final class StickerModel {
        let photoProcessor: PhotoProcessor
      
        var selection: [PhotosPickerItem]
      }
      
      extension StickerModel: Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 35:06 - Concurrency: Explicitly offloading async work

      // Explicitly offloading async work
      
      class PhotoProcessor {
        var cachedStickers: [String: Sticker]
      
        func extractSticker(data: Data, with id: String) async -> Sticker {
            if let sticker = cachedStickers[id] {
              return sticker
            }
      
            let sticker = await Self.extractSubject(from: data)
            cachedStickers[id] = sticker
            return sticker
        }
      
        @concurrent
        static func extractSubject(from data: Data) async -> Sticker {}
      }
    • 0:00 - Introduction & Agenda
    • Learn what's new in Swift 6.2. Highlights include: workflow enhancements, new library APIs, expanded adoption across the software stack, and improved concurrency language features for more productive coding.

    • 0:48 - swiftlang updates
    • The swiftlang organization on GitHub has grown significantly, encompassing over 50 projects, including the Swift compiler, Xcode’s build system Swift Build, and the Swift.org website. Swift Build, now open source, supports the build process for Apple operating systems, and is adopted by the Swift Package Manager. A new version manager, swiftly, originally developed for Linux, now supports macOS and simplifies Swift toolchain management. The redesigned Swift.org homepage can also help you dive into different areas.

    • 3:06 - Development workflow: Writing code
    • The latest Swift release enhances development workflows across all platforms, with specific improvements for VS Code Swift extension users including official verification and distribution of the Swift extension by Swift.org. Now, there's also background indexing for real-time editor features, enhanced code completion, simplified debugging with automatic LLDB support, and new project panel and live DocC previews.

    • 4:40 - Development workflow: Building
    • Swift 6.2 introduces several enhancements to boost your productivity. Clean build times for projects utilizing macro-based APIs are significantly improved by eliminating the need to build the swift-syntax library during clean builds. This optimization, supported by Swift PM and Xcode, can reduce build times by minutes. This release also enhances compiler diagnostics documentation by providing more detailed explanations of common warnings and errors, making them easier to understand and resolve. Additionally, you now have greater control over compiler warnings; you can specify which warnings to treat as errors, a feature driven by community feedback.

    • 7:36 - Development workflow: Debugging
    • Debugging is also enhanced in Swift 6.2, particularly for asynchronous code, with improved LLDB functionality, task naming and visibility in Instruments profiles. It also has faster debugger response times due to explicitly built modules enabled by default in Xcode 26.

    • 9:14 - Libraries: Subprocess
    • This release introduces the new Subprocess package, with which you can launch and manage subprocesses directly from Swift code. The package gives you fine-grained control over process execution, so you can specify the executable path. When the subprocess terminates, you can inspect the exit status, standard output, and other information about the process execution, with version 0.1 now available and ready for feedback.

    • 10:45 - Libraries: Foundation
    • The Foundation Workgroup enhanced iOS app development by introducing concrete types for notification names and payloads, streamlining code, eliminating errors, and improving thread safety for both framework and custom notifications. You can also add concrete notification types for your own notifications.

    • 12:31 - Libraries: Observation
    • The Observation Library in Swift uses the observer pattern to track state changes in an object graph. The 'Observable' macro enables observation tracking. Swift 6.2 introduces the 'Observations' type, with which you can create an 'AsyncSequence' to stream state changes based on a closure that computes a value from observable properties. Updates are transactional, ensuring consistent state, and you can iterate over them using a for-await loop.

    • 14:13 - Libraries: Testing
    • Using Swift Testing, a cross-platform library, you can write and organize tests by using macros. Swift 6.2 enhances this capability with custom attachments for better failure diagnosis, especially in remote environments, and exit tests to validate code that terminates under specific conditions. These features support testing portable Swift code, beyond just your application code.

    • 16:08 - Swift throughout the stack: Embedded Swift
    • Swift 6.2 enhances Embedded Swift, enabling you to write code for embedded devices, servers, and security-critical components. It now includes full-string APIs, Swift's 'any' types for class-constrained protocols, and new APIs like 'InlineArray' and 'Span' for working efficiently with regions of memory. Apple uses Embedded Swift in some of the lowest-level software on iPhone, and the community created examples available on GitHub in the swift-embedded-examples repository.

    • 18:00 - Swift throughout the stack: Security
    • Swift 6.2 introduces strict-memory-safety mode, an opt-in feature that requires explicit acknowledgment of unsafe API uses, aiding in identifying security-critical code sections. Apple is adopting this mode in WebKit and a Messages app subsystem, which both handle untrusted input.

    • 19:37 - Swift throughout the stack: Server
    • Swift is widely used in the server ecosystem, particularly at Apple, where it powers backend services processing millions of requests per second. A notable example is a password alert service, previously built in Java, which saw a 40% increase in throughput and a 50% reduction in hardware requirements after being rewritten in Swift. Other companies, such as Cultured Code, also benefited significantly from adopting Swift. The Things Cloud backend, reimplemented in Swift, experienced a 3x reduction in compute costs and a 400% improvement in average response times. Swift's growing package ecosystem, interoperability with C, Objective-C, and C++, and new open source projects like swift-java and a containerization library, enable developers to build efficient, performant server backends, and seamlessly integrate Swift with existing codebases, particularly in Java.

    • 23:23 - Swift throughout the stack: Platforms
    • Swift 6.2 now officially supports FreeBSD and WebAssembly (Wasm), enabling you to build client and server applications for browsers and other runtimes. The Wasm support, which started as a community project, allows you to compile Swift code and run it in the browser, as demonstrated by a 3D rendering app using WebGPU and JavaScriptKit. Swift's safety, ease of use, and performance make it an attractive choice throughout the software stack.

    • 26:11 - Language evolution: Performance
    • The new release also introduces two new types, 'InlineArray' and 'Span', to enhance performance of critical code. 'InlineArray' is a fixed-size array that stores elements directly, eliminating the need for heap allocation. This improves performance, especially in hot paths, and enables more optimizations like eliminating bounds checking. The system specifies the size of an 'InlineArray' as part of the type, and can infer it from array literals. 'Span' provides fast, direct access to contiguous memory without compromising memory safety. It allows functions to operate over the underlying storage of various container types, such as 'Array' and 'InlineArray', safely and efficiently. 'Span' ensures memory validity through compile-time checks, preventing common memory safety issues inherent to pointers.

    • 30:28 - Language evolution: Concurrency
    • Concurrency is a challenging aspect of programming due to the potential for data races when multiple tasks share memory. Swift 6 introduced data-race safety at compile time, but this often led to compiler errors when because the language would offload work to the background implicitly, even if you never needed the code to run in parallel. Swift 6.2 addresses this issue by changing the default philosophy to stay single-threaded until the you explicitly introduce concurrency. This capability, by default, makes the most natural code to write data race-free. The language now allows async functions that aren't tied to a particular actor to continue in the same actor it was called from, eliminating data races. The release also introduces isolated conformances, enabling main actor types to conform to protocols while ensuring the compiler protects main actor state. Additionally, there's now an opt-in mode to infer the main actor by default, reducing concurrency annotations in mostly single-threaded code. When you need concurrency for performance improvement, such as offloading CPU-intensive tasks to the background, Swift 6.2 provides tools to do so safely. The concurrent attribute ensures that specific functions run on the concurrent thread pool, freeing up the current actor to perform tasks simultaneously. These changes work together to make concurrency more approachable and easier to implement in Swift projects.

    • 37:15 - Wrap up
    • User feedback led to Swift's concurrency improvements, making it more user friendly. The community is encouraged to participate in the forums at Swift.org to continue language and ecosystem development, share projects, and stay updated on Swift-related events.

Developer Footer

  • ビデオ
  • WWDC25
  • Swiftの新機能
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン