上記の3つの用語の違いを理解し、新しい用語type erased
コンテナを見つけるために、たくさんのチュートリアルに頭を悩ませていますが、今では混乱します。それは多くの疑問を提起します。
Swiftが導入するのはなぜAnyHashable
ですか?
これらの3つの用語の根本的な違いは何ですか?
違いAny
とAnyHashable
?
違いHashable
とAnyHashable
?
いつHashable
使用するAnyHashable
か、いつ使用するか?
最後になりましたが、最も紛らわしいのtype erased
は、文脈における用語の意味は何AnyHashable
ですか?
コンテキストとして、私はSwift Evolution ProposalSE-0131に従いました。
それらの違いよりも、それらが何であるかを理解することが重要です。
Any
迅速な列挙型、タプル、クロージャ、構造体、クラス、プロトコルなど、あらゆるものを意味します。すべてのタイプは、タイプの変数に割り当てることができますAny
。
Hashable
「このオブジェクトはハッシュ可能、つまりハッシュコードがある」というプロトコルです。オブジェクトをハッシュできる場合は、このプロトコルを実装します。これは、多くのデータ構造(つまり、辞書とセット)がそれを必要とするためです。
それで、何AnyHashable
ですか?
通常、これを行おうとすると:
let a: Set<Hashable>?
コンパイルされません。これはあるHashable
から継承Equatable
含まれていますSelf
。
ここで、Objective-Cからswiftにメソッドを移植するとします。そのメソッドは、タイプのパラメーターを取りますNSSet
。Swiftでは、これはに変わりSet
ますが、その一般的なパラメーターは何ですか?sの場合と同じAny
ように配置するとNSArray
、Set
のオブジェクトはハッシュ可能でなければならないため、機能しません。しかし、一般的な制約としてのみ使用できるSet<Hashable>
ため、これも機能しませんHashable
。彼らはラップ理由ですHashable
とAnyHashable
そのていない使用Self
などの一般的なパラメータとして使用することができます。
「タイプ消去」の意味について:
持つSelf
プロトコルでは、種類のものであるジェネリックパラメータとプロトコルのような、そして一般的なパラメータは、常に準拠するクラスです。これにより、Set<Hashable>
「一般的なパラメータ」が不明であるため、プロトコルを単独で使用できなくなります。AnyHashable
まったく使用Self
しないことでこの問題を解決するため、通常の構造体になります。ジェネリックSelf
型を「消去」します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加