問題タブ [hashable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - SwiftでhashValueからhash(into:)を実装する方法は?
コンパイラからの非推奨警告を使用hashValue
せずに実装する方法については、まったくわかりませんhash(into:)
。
「Hashable.hashValue」はプロトコル要件として非推奨です。代わりに「hash(into:)」を実装することにより、タイプ「MenuItem」を「Hashable」に適合させます
Swiftからの回答: 'Hashable.hashValue' はプロトコル要件として非推奨です。この例があります:
PagingItem
そして、Parchment ( https://github.com/rechsteiner/Parchment )をカスタマイズするために、この構造体を持っています。
swift - Swift - Decimal の hashValue は X == -X と同じであり、hashValue の比較には使用できません
一方が他方の負の値である場合、2 つの Decimals を hashValue で区別できないことがわかりました。Decimals を構造体のフィールドとして使用し、その構造体は Hashable を実装してセットに入れることができるようにします。ビジネス ロジックでは、すべてのフィールドが一意である必要があるため、すべてのフィールドと組み合わせて hashValue を指定します。つまり、10 進数フィールドが他方の負の値であり、残りのフィールドが実際に等しい 2 つの構造体は、構造体全体が等しいと見なされます。これは私たちが望んでいるものではありません。
遊び場コード:
doubleLiteral
の代わりに を使用してテストする場合も同じことが起こりintegerLiteral
ます。
回避策は、Decimals を直接比較し、必要に応じて、他の部分で必要な場合は hashValue に含めることです。
この動作は意図したものですか? 仮数部は同じなので、等しいと見なされないのは、Decimal の hashValue に符号が含まれていないためだと思いますか?
swift - Swift hash(into:) のキャッシュ結果 Hashable プロトコル要件
セットと辞書で頻繁に使用されるクラスがあります。パフォーマンス上の理由から、このクラスHashable
は古い方法で実装し、計算されたハッシュをキャッシュします。
Xcode 10.2 では、警告が表示されます。これhashValue
は非推奨であり、まもなくプロトコル要件ではなくなります。
私を悩ませているのは、hash(into:)
何も返さないため、計算されたハッシュをとにかくキャッシュする機能がないことです。
遊び場で次の例を考えてみましょう
次のログが表示されます
なぜ 2 つではなく 3 つの呼び出しが表示されるのかわかりませんが、=) を実行します。
したがって、同じインスタンスを辞書キーとして使用するか、このインスタンスをセットに追加するたびに、新しいhash(into:)
呼び出しが発生します。
私のコードでは、このようなオーバーヘッドは非常に高価であることが判明しました。誰かが回避策を知っていますか?