この記事の要点
- Foundation の未来で構想として示されていた、Swift で書き直された新しい Foundation のプレビュー版が、swift-foundation として GitHub で公開されました。C や Objective-C による従来実装を置き換える、より高速で安全、かつ貢献しやすい統一実装です。
Calendar・TimeZone・Locale・JSONEncoderなどがすべて新しい Swift 実装になり、FormatStyle・ParseStrategyがはじめてオープンソースとして公開されました。型はFoundationEssentialsとInternationalizationのモジュールに分かれて提供されます。- ネイティブ Swift 実装になったことで大幅な性能向上が示されており、たとえば JSON のデコードは従来比で 200% から 500% 近く高速化したと報告されています。
- あわせて、コミュニティによる API 提案をレビューする Foundation Workgroup の設置と、新 API の提案プロセスが用意されました。
- プレビュー版は完成版ではなく、開発中の Swift 5.9 ツールチェインに依存します。早期のテストと貢献を募る段階での公開です。
何が発表されたのか
Foundation の未来で示されていた構想が、実際のコードとして GitHub で利用できるようになりました。今回公開されたのは、Swift で書かれた統一実装としての Foundation のプレビュー版です。従来の C・Objective-C 実装に比べて、高速で安全、かつ新しい貢献者にとっても扱いやすいことを目指しています。
まだ完成版ではありませんが、統一された Swift 実装の最初の構成要素が揃っており、早期のテストと貢献を Swift コミュニティに広く呼びかける段階として公開されました。
何に使えるのか
プレビューパッケージでは、次の型が利用できます(今後さらに追加される予定です)。Calendar・TimeZone・Locale・JSONEncoder を含む多くの型が、新しい Swift 実装になっています。また FormatStyle と ParseStrategy は、今回はじめてオープンソースとして公開されました。
- FoundationEssentials
AttributedStringDataDateDateIntervalJSONEncoderJSONDecoderPredicateStringのエクステンションUUID
- Internationalization
CalendarTimeZoneLocaleDateComponentsFormatStyleParseStrategy
Darwin 以外のプラットフォームでローカライズ機能をサポートするため、ICU の実装とデータを含む別パッケージ FoundationICU も用意されました。共通のバージョンの ICU を使うことで、日付・時刻・数値のフォーマット結果がプラットフォーム間でより一貫したものになります。
なお、このプレビューパッケージは開発中の Swift 5.9 ツールチェインに依存します。
パフォーマンス
Swift で書かれたことにより、従来の C・Objective-C 版に対して大きな利点が生まれています。
Locale・TimeZone・Calendarは Objective-C からのブリッジを必要としなくなり、固定のLocaleを取得するような一般的な処理が桁違いに高速になります。Calendarの日付計算は Swift の値セマンティクスを活かして中間的なアロケーションを避けられるようになり、一部のベンチマークでは 20% 以上の改善が見られます。FormatStyleによる日付フォーマットも大きく高速化し、標準的な日付・時刻テンプレートでのフォーマットのベンチマークでは 150% もの改善が示されています。- とりわけ JSON のデコードが大きく改善しました。
JSONDecoder・JSONEncoderが新しい Swift 実装になり、Objective-C のコレクション型との変換往復をなくしたことで、Codable型の初期化と JSON パースを密に統合できます。ベンチマークではデコード時間が 200% から 500% 近く改善しています。
導入・今後の位置づけ
ガバナンスと提案プロセス
Foundation を新しい実装へ移行するには、実装そのものの改善だけでなく、Apple のプラットフォーム外でも使えるようにするためのプロセスの改善も必要です。そこで Foundation には、Swift 開発者の利益のためにコミュニティが新しい API を追加できる道が用意されました。
Foundation パッケージは独立したプロジェクトとして、初期のインキュベーション段階にあります。Swift プロジェクトのワークグループに着想を得て、コミュニティからの API 提案をレビューし、Swift プロジェクトや Apple プラットフォームでの開発と密に連携するためのワークグループ(Foundation Workgroup)が置かれます。将来的には、既存の swift-corelibs-foundation を段階的に終息させ、このプロジェクトで作られる新しい Foundation へ移行する方法も検討するとされています。
今後の見通し
ここから先は発表時点で示されていた構想であり、実現を約束するものではありません。
プロジェクトの最重要目標は品質とパフォーマンスです。2023 年前半は、中核 API の継続的な改良、ユニットテストとパフォーマンステストの拡充、可能な範囲での他プラットフォームへの展開が計画として挙げられました。あわせて、既存 API を補完する範囲に絞ったコミュニティからの API 提案を募り、2023 年中に少数の提案を実装とともに受け入れることで、提案プロセスそのものを洗練させる方針が示されました。
また、2023 年中の後半には、URL・Bundle・FileManager・FileHandle・Process・SortDescriptor・SortComparator など、さらなる Foundation API の高品質な Swift 実装への移植を続ける予定とされていました。
Foundation はコミュニティからの貢献を歓迎しており、議論には Swift フォーラム、バグや機能要望の管理には GitHub Issues が使われます。