Swift Digest
Blog | Swift.org Blog

Swift 5.6 リリース

Swift 5.6 Released!

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

主な変更点

型システムの拡張

type placeholder(SE-0315

型推論で省略できる部分は省略しつつ、明示が必要な部分だけを書きたい場合があります。type placeholder は、型注釈の一部を _ で書き、その部分の型をコンパイラに推論させる機能です。

enum Either<Left, Right> {
  case left(Left)
  case right(Right)
}

// Either<ClosedRange<Int>, Range<Int>> と推論される
let either: Either<_, Range<Int>> = .left(0...10)

型全体を書かずに、明確さのために必要な部分(ここでは Range<Int>)だけを指定できます。

existential anySE-0335

existential 型は、特定のプロトコルに適合する任意の型の値を保持するための型です。Swift 5.6 までは、existential 型はプロトコル名(やプロトコル合成)をそのまま書く構文でした。

protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [DataSourceObserver] { ... }
}

existential 型は元の型情報を消去するため、動的に型を切り替えられる一方で、プロトコルへの適合などはできないといった制約があります。しかし、従来の構文では existential 型がジェネリックの適合要件と見分けがつかず、この違いが分かりにくいという問題がありました。

Swift 5.6 では、existential 型を any キーワードで明示できるようになりました。

protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [any DataSourceObserver] { ... }
}

Swift 5.6 時点では any は任意ですが、existential 型を使っていることがコード上で明確になります。

ポインタとの相互運用の改善

concurrency チェックへの段階的な移行(SE-0337

Swift 5.6 では、Sendable に関する診断はデフォルトでは抑制されています。Sendable への適合を明示的に書くか、-warn-concurrency コンパイラフラグを使うことで診断を有効にでき、concurrency チェックへ段階的に移行できます。これにより、既存コードを一度にすべて対応させなくても、少しずつデータ競合安全性に近づけられます。

Swift Package Manager のプラグイン

Swift 5.6 で Swift Package Manager に拡張性のための機能が加わり、あわせてセキュリティ・性能・信頼性の重要なアップデートも入りました。

build tool plugin(SE-0303

ビルド中に自動的に呼び出されるカスタムツールを、プラグインとして定義できるようになりました。.proto ファイルなどの入力から Swift のソースファイルを生成する、といったビルド中のコード生成を主な用途とします。ビルドグラフに組み込まれ、安全な形で自動実行されます。

command plugin(SE-0332

SE-0303 で導入されたプラグインの仕組みを拡張し、ユーザーが SwiftPM の CLI や対応 IDE から直接呼び出せるカスタムコマンドを定義できるようになりました。コマンドには「ドキュメント生成」「ソースコードの整形」といった定義済みの意図か、独自の動詞(swift package <verb>)を指定できます。

その他の SwiftPM の更新

Swift-DocC のアップデート

Swift 利用者への影響

関連リンク