見出し画像

New Swift! 2022 - その他。

Unlock existentials for all protocols

selfやassociated typeを持つ"protocol"をとして使うことが可能になりました。

以下は5.7より"any"を付けることで使えるようになりました。

let firstName: any Equatable = "Paul"
let lastName: any Equatable = "Hudson"

違う型に対しても使えます。

let tvShow: [any Equatable] = ["Brooklyn", 99]

データを使う場合は以下のよう場合分けして使うことができます。

for parts in tvShow {
    if let item = parts as? String {
        print("Found string: \(item)")
    } else if let item = parts as? Int {
        print("Found integer: \(item)")
    }
}

または

if let firstName = firstName as? String, let lastName = lastName as? String {
    print(firstName == lastName)
}

として使うことができます。


Lightweight same-type requirements for primary associated types, Constrained Existential Types

Selfやassociated typeを持つProtocolにおいても型として利用することが可能になりました。一方、そのassociated typeについて制約を課したい状況はあるはずです。そこで、protocolにジェネリクスを設定して型を渡すことでシンプルに解決できるようになっています。

"some"を付けるOpaque Typeをうまく使い簡潔に書けるようになったということです。

おまけ。

resultBuilderとは

この機能を一言で説明すると「内部DSLの生成補助ツール」

「内部DSLの生成補助ツール」とは

DSLとはドメイン固有言語の略称であり、特定のドメイン領域に特化した言語のことを意味します。
DSLにも2種類あり、プログライミング言語の書き方を工夫して見かけ上の構文を自然言語に近づけたものを内部DSL、汎用プログラミング言語とは全く別の構文を持ったものを外部DSLと呼ぶそうです。

DSLの仕組みを使っているのがSwiftUI。

swiftにおける内部DSLとは「swiftという言語を拡張し、特定のドメイン領域の実装を書きやすく読みやすくした言語」だと言えそうです。


この記事が気に入ったらサポートをしてみませんか?