検索
ニュース

Apple、プログラミング言語「Swift 6」公開 5年ぶりのメジャーアップデート、変更点は?「Swift Testing」追加、静的リンクされたLinuxバイナリビルドサポートなど

Appleは、オープンソースのプログラミング言語の最新版「Swift 6」を公開した。

Share
Tweet
LINE
Hatena

 Appleは2024年9月17日(米国時間)、オープンソースのプログラミング言語の最新版となる「Swift 6」を公開した。

 Swiftは、静的型付けができる言語であり、Appleの「iOS」「macOS」「watchOS」「tvOS」でローカルに動くアプリケーションの構築に向いている。さらに、クロスプラットフォーム対応により、サーバーサイドやApple以外のプラットフォーム向けアプリケーション開発にも利用できる。

 Swift 6の主な変更点は次の通り。

言語

並行処理(Concurrency)機能の安全性向上

 新たなオプトインの言語モードが追加され、並行処理コード内の潜在的なデータ競合がコンパイルエラーとして検出するようになった(非対応コードはビルドできなくなる)。並行処理コードにおけるデータ競合を防ぐことが可能となり、安全性が向上した。

エラーの型指定

 関数のシグネチャにおいて、関数がスローするエラーの型指定に対応した。関数がスローするエラーの処理が容易になり、メモリの割り当てができないリソース制約のある組み込みSwiftコードで役に立つという。

func parseRecord(from string: String) throws(ParseError) -> Record { 
  // ... 
}
エラーの型としてParseErrorを指定したparseRecord関数のシグネチャ
do {
  let record = try parseRecord(from: myString)
} catch {
  // 'error' has type 'ParseError'
}
do-catchブロック内で上記のparseRecord関数を実行すると、エラーはParseError型になる

非コピー型の導入による所有権管理の改善

 Swift 5.9で導入された非コピー型(non-copytable types、~Copyable構文で指定できる)をジェネリクス機能に統合し、コピー可能な通常の型と非コピー型の両方を同じ関数やデータ構造内で扱うことが可能になった。

protocol Drinkable: ~Copyable {
  consuming func use()
}
struct Coffee: Drinkable, ~Copyable { /* ... */ }
struct Water: Drinkable { /* ... */ }
func drink(item: consuming some Drinkable & ~Copyable) {
  item.use()
}
drink(item: Coffee())
drink(item: Water())
コピー型と非コピー型を扱う例

 Swift 6では、switch文で非コピー型を扱う際にコピーを避けることが可能となり、パフォーマンスが向上した。またOptionalやResultといった標準ライブラリも非コピー型をサポートしている。

C++との相互運用性強化

 Swift 5.9で導入されたC++ interoperability(C++との相互運用性)により、既存のC++プロジェクトにSwiftを統合できるようになった。Swift 6では、相互運用性が強化され、以下の機能をサポートするようになった。

  • C++のmove-only型
  • 仮想メソッド
  • デフォルト引数
  • 標準ライブラリの型(std::mapやstd::optional)

 コピーコンストラクタを持たないC++型は、Swift 6から非コピー型としてアクセスできるようになった。

組み込みSwift(プレビュー)

 マイクロコントローラーのプログラミングなど、組み込みソフトウェア開発に適した言語サブセットおよびコンパイルモードである「Embedded Swift(組み込みSwift)」のプレビューが追加された。

128bit整数のサポート

 128bit整数型がサポートされた。全てのSwiftプラットフォームで使用できる。

ライブラリ

Foundation実装の統一

 Swiftをサポートする全てのプラットフォームでFoundationライブラリの実装が統一され、ライブラリの一貫性が強化された。JSONDecoder、URL、Calendar、FileManager、ProcessInfoなど、多くのFoundationのコア型が再実装されている。

 macOSやiOSのみで利用可能だったAPI(FormatStyle、ParseStrategy、Predicate、JSON5)が、Swiftをサポートする全てのプラットフォームで利用可能となり、Swift 6でFoundationに追加されたExpressionなどの新しいAPIもLinuxやWindowsからアクセスできる。

「Swift Testing」の導入

 新しいテストライブラリとしてSwift Testingが導入された。テストの作成と整理を容易にするAPIなどを提供し、#expectのようなマクロを使用して、テストが失敗した場合の詳細を出力できるようになった。異なる引数でテストを簡単に繰り返す機能により、大規模なコードベースにも拡張可能だ。

@Test("Continents mentioned in videos", arguments: [
  "A Beach",
  "By the Lake",
  "Camping in the Woods"
])
func mentionedContinents(videoName: String) async throws {
  let videoLibrary = try await VideoLibrary()
  let video = try #require(await videoLibrary.video(named: videoName))
  #expect(video.mentionedContinents.count <= 3)
}

 Swift Testingは、Swift 6ツールチェーンに統合されているため、パッケージの依存関係を宣言せずに利用できる。Foundation実装と同様、Swiftが公式にサポートしているApple、Linux、Windowsをサポートしている。

プラットフォーム

「Static Linux SDK」の利用が可能に

 Swift 6では「Static Linux SDK」をサポートし、静的リンクされたLinuxバイナリのビルドが可能になった。これにより、どのLinuxディストリビューションでも実行できるLinuxバイナリをビルドし、直接システムやコンテナ上にコピーして実行させることができる。Static Linux SDKは、Swiftがサポートする全てのプラットフォームからLinuxにクロスコンパイルするためにも使用できる。

新しいLinuxディストリビューションへの対応

 DebianとFedoraおよびUbuntu 24.04でのサポートとテストが追加された。

Windowsビルドのパフォーマンス向上

 arm64アーキテクチャ用のビルドツールチェーンが利用可能になり、Armホスト上のWindowsのコンパイラパフォーマンスが向上した。

 Swift 6のSwiftパッケージマネジャーは、デフォルトでWindows上の複数コアにまたがってビルドを並列化する。10コアのマシンでは、ビルドのパフォーマンスを10分の1まで向上できる。

 その他、デバッグ時のパフォーマンス改善など複数の機能の追加や改善が行われている。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る