BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 並行性サポート、列挙型、プロパティラッパなどを強化したSwift 5.5

並行性サポート、列挙型、プロパティラッパなどを強化したSwift 5.5

原文(投稿日:2021/09/28)へのリンク

Appleのプログラミング言語Swift 5.5の最新リリースでは、非同期コードの記述を簡単にすることを目的とした新機能に加えて、CGFloatDoubleの互換性を始めとするいくつかの拡張が言語とコンパイラに導入されている。

async/awaitを含む新たな並行性機能(concurrency features)、非同期シーケンス、アクタによって非同期コードの記述方法が大幅に変わり、C#やF#、JavaScipt/TypeScriptなど、多くの言語により近いものになる。

InfoQはWWDC 2021で発表された時点で、すでにSwift 5.5の新しい並行性機能についてお伝えしている。簡単に振り返ると、関数がasyncであることを選択できるようになった。これによりコンパイラは、その関数をfutureとpromiseを使用したコードに変換する。プログラマの視点から見たおもなアドバンテージは、async/awaitによって、シーケンシャルなコードと同じように並行コードを記述できるようになることだ。一方のアクタは、書き込みアクセスをシーケンシャルにする操作キューによって、状態をカプセル化できるようにする。詳細は以前の記事を参照して頂きたい。

すでに述べたように、今回のSwiftリリースの重点は並行性に限らない。中でも特に、多くの開発者に待ち望まれていた新機能が、CGFloatDoubleが相互変換可能になったことだ。例えば、

let cgFloat: CGFloat = 42
let double: Double = 19
let mix = cgFloat + double

内部的には、SwiftコンパイラがすべてのCGFloatDoubleにブリッジする。従って、既存の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用が公開されている。

この記事に星をつける

おすすめ度
スタイル

BT