2016-05-28 4 views
0

私はキーを一連の文字列として辞書に値を格納したい場合があります。 Pythonで化合物タイプはスウィフト辞書キーですか?

は、例えば、私はタプルを使用したい:スウィフトで

foo = {('a', 'b', 'c'): 10} 

を、しかし、辞書のキーはハッシュ可能でなければならず、タプル(という構造体)がありません。どちらも配列ではありません。 (私はこれを知っているので、これは「速攻では辞書の中のキーとしてタプルを使うことはできますか?」という質問とは異なります)。

私は自分で書くことができますclass ListOfStrings: Hashableクラスはそれ自身のハッシュコードを持つ[String]ですが、それは高水準言語でやってはならないことのようです。

私はNSDictionary/NSArrayを使うことができましたが、それはまた厄介な解決策のようです。さらに、NSArrayのハッシュコードは単純にその長さに過ぎず、パフォーマンスには向いていません。

Swiftでこれを行うより良い方法はありますか?

+0

'NSMutableSet'または' NSSet'は動作しますか? –

+0

l'l'l:鍵として意味しますか?私の文字列の順序を失うだけでなく、それはサイズをハッシュコードとして使うことを含め、NSArrayとしてのすべての問題を共有しているようです。http://opensource.apple.com//source/CF/CF-635.19/CFBasicHash.m – You

+0

はい、それはおそらくそれにいくつかのハックなことをすることなく、あなたが望むように動作しない可能性があります。 NSArray上のメンバーオブジェクトをチェックするのにNSSetは一般的に高速です。 –

答えて

0

あなたは使用して文字列の連結に、文字列のリストを変更する、そうではなく、可能性:

foo ["a"+"b"+"c"] = someInteger 

辞書はその後、単に文字列を使用している:あなたは単にそれを書くだろう

foo ["a","b","c"] = someInteger 

キーとして私は推測していることは、あなたのコードの残りの部分で変更する必要はないだろう。一意のキーが常に得られるように、慎重に使用されている文字列を処理する必要がありますが、すでにカバーしているような印象を受けます。

+0

私は文字列の値について何も保証できません。これは '(" a "、" bc ")'と '(" ab "、" c ")'をハッシュします。区切り文字として使用できる有効なUnicode文字ではないSwift Stringに入れることができる文字値がありますか? – You

+0

データ構造の内容を完全に把握していなければ、それは難しいです。文字列のすべての文字はUnicodeでなければならないと思いますが、使用できる入力文字列(たとえば、絵文字のようなもの)には表示されないことがあります。 1つの考え:文字列を制御できない場合は、各セットが一意であることを保証するために何かを行う必要があります。おそらく上記の問題の解決策をそのプロセスに組み込むことができます。 – Westside

+0

その他の問題はパフォーマンスです。私はそれらを '' | ''で結合することができ、その文字が入力に現れるなら、それを倍にしてエスケープすると、それは安全です。欠点は、既存の文字列への参照だけを格納するのではなく、それぞれのキーを意味するということです。すべての文字列よりも長い文字列を作成する必要があります。 – You

関連する問題