Appleのプログラミング言語Swift 5.5の最新リリースでは、非同期コードの記述を簡単にすることを目的とした新機能に加えて、CGFloat
とDouble
の互換性を始めとするいくつかの拡張が言語とコンパイラに導入されている。
async/await
を含む新たな並行性機能(concurrency features)、非同期シーケンス、アクタによって非同期コードの記述方法が大幅に変わり、C#やF#、JavaScipt/TypeScriptなど、多くの言語により近いものになる。
InfoQはWWDC 2021で発表された時点で、すでにSwift 5.5の新しい並行性機能についてお伝えしている。簡単に振り返ると、関数がasync
であることを選択できるようになった。これによりコンパイラは、その関数をfutureとpromiseを使用したコードに変換する。プログラマの視点から見たおもなアドバンテージは、async/await
によって、シーケンシャルなコードと同じように並行コードを記述できるようになることだ。一方のアクタは、書き込みアクセスをシーケンシャルにする操作キューによって、状態をカプセル化できるようにする。詳細は以前の記事を参照して頂きたい。
すでに述べたように、今回のSwiftリリースの重点は並行性に限らない。中でも特に、多くの開発者に待ち望まれていた新機能が、CGFloat
とDouble
が相互変換可能になったことだ。例えば、
let cgFloat: CGFloat = 42
let double: Double = 19
let mix = cgFloat + double
内部的には、SwiftコンパイラがすべてのCGFloat
をDouble
にブリッジする。従って、既存のAPIを変更する必要はない。ただし現在の実装では、このブリッジにいくつかの制限がある点に注意が必要だ。例えば、CGFloat?
に対してDouble
を、Double?
に対してCGFload
を使用することは可能だが、Double?
とCGFloat?
はブリッジされないため、明示的に型変換を行う必要がある。同じように、タプル(tuple)内でもブリッジは動作しない。
またSwift 5.5では、関連型enum
がアップグレードされて、Codable
プロトコルを実装する場合の自動合成(auto-synthesize)が可能になった。これまで、関連型enum
の自動合成はRawRepresentable
プロトコルに準拠する場合に限られていたため、それ以外のケースでは開発者が定型的なコードで対応する必要があった。例えば、次のような記述が、
enum Command: Codable {
case load(key: String)
case store(key: String, value: Int)
}
このようにエンコードされるようになる。
{
"load": {
"key": "MyKey"
}
}
{
"store": {
"key": "MyKey",
"value": 42
}
}
Swift 5.1で導入されたプロパティラッパ(property wrapper)が拡張され、関数やクロージャのパラメータに適用できるようになった。簡単にいうと、プロパティラッパとは、繰り返しパターンを定義して名前を割り当てることで、簡単に再利用できるようにするメカニズムである。例えば、Swift言語ではlazy
と@NSCopying
というキーワードがサポートされていて、プロパティの動作を具体的に指定することができる。プロパティラッパはこのメカニズムを汎用的にしたもので、開発者のニーズに合わせた新たなパターンの作成が可能になる。Swift 5.1では、例えばField
というプロパティラッパを定義して、データベースのフィールドを名称で参照し、対象とする値を透過的に読み込み/書き込みするようなことが可能であった。
@propertyWrapper
public struct Field<Value: DatabaseValue> {
...
}
プロパティラッパを一度定義すれば、プロパティの修飾に使用できるようになる。
public struct Person: DatabaseModel {
@Field(name: "first_name") public var firstName: String
...
}
Swift 5.5では、これまでは許されていなかった、関数やクロージャのパラメータとしてプロパティラッパを使えるようになる。
Swift 5.5には、ここで要約したもの以外にも、パッケージコレクションやジェネリクスにおけるstaticメンバ探索の拡張、タスクローカルなコントロールなど、多数の機能が含まれている。それぞれのSwift Evolution提案に関する公式発表に注目して頂きたい。
Swift 5.5は現在、Xcode 13の一部として提供されている他、LinuxとWindow 10用が公開されている。