2016-02-21 2 views
5

Iこのようなものがあります:私のsize辞書の定義でメタタイプ(.Type)を辞書のキーとして使用できますか?

class Lumber { } 
class Fruit { } 

enum Size { 
    case Small 
    case Medium 
    case Large 
} 

let lumberSize = [ 
    Size.Small: "2x4", 
    Size.Medium: "4x6", 
    Size.Large: "6x10" 
] 

let fruitSize = [ 
    Size.Small: "grape", 
    Size.Medium: "apple", 
    Size.Large: "watermelon" 
] 

let size:[AnyObject.Type:Dictionary] = [ 
    Lumber.Type: lumberSize, 
    Fruit.Type: fruitSize 
] 

を、私はXcodeのエディタからこのリアルタイムのエラーを取得:

タイプは 'AnyObject.Type' プロトコルに準拠していません " Hashable '

あなたはこれが解決すると思うかもしれません。 Xを辞書のキーとして使いたいが、ハッシュ可能でない場合は、単に使用できません。それは理にかなっている。

ただし、2つの理由でエラーメッセージが表示されません。

まず、現時点では、リアルタイムのXcodeエディターのエラーメッセージは、基本を超えてひどいです。 1日に数回、間違っていることを推測して無視し、それが受け入れられるまで構文を聞かなければなりません。

第2に、私はエラーメッセージを反論する文書の単語を読んでいると思います。 Swift 2.2 Language Referenceでは、タイプの下で、それは読む:

クラス、構造体、または列挙型のメタタイプが.TYPE

続くそのタイプの名前であり、Swift Standard Library ReferenceにObjectIdentifier構造参照は、

となります。Swiftでは、クラスインスタンスとメタタイプだけが一意のIDを持ちます。

このセクションでは、それに準拠するプロトコルとしてHashableも記載しています。

私がこの権利を読んでいるなら、すべてのタイプは、Hashableによって使用されるObjectIdentifierを持っています。私は、Comparableを例として(間違って)使っていました。 ObjectIdentifierがComparableに準拠しているため、型を比較できますか? ObjectIdentifierはHashableにも準拠しているので、辞書でそれを使用できるはずです。

今私は、私がやろうとしていることは実際には可能だと思っていますが、私は正しい構文を得ることができません。

答えて

7

Hashableは、ObjectIdentifierが実装するプロトコルです。これはObjectIdentifier(Lumber.Type)がハッシュ可能であり、Lumber.Typeではないことを意味します。あなたはのように、ObjectIdentifierを使用するようにコードを変更してみてください:

class Lumber { } 
class Fruit { } 

enum Size { 
    case Small 
    case Medium 
    case Large 
} 

let lumberSize = [ 
    Size.Small: "2x4", 
    Size.Medium: "4x6", 
    Size.Large: "6x10" 
] 

let fruitSize = [ 
    Size.Small: "grape", 
    Size.Medium: "apple", 
    Size.Large: "watermelon" 
] 

let size:[ObjectIdentifier: [Size: String]] = [ 
    ObjectIdentifier(Lumber): lumberSize, 
    ObjectIdentifier(Fruit): fruitSize 
] 

これはコンパイルが、私はそれはあなたの特定のニーズを満たしているかはわかりません。個人的には、クラス名の文字列バージョンをキーとして使用します - String(Lumber)

let size:[String: [Size: String]] = [ 
    String(Lumber): lumberSize, 
    String(Fruit): fruitSize 
] 
+0

私は、Swiftをより深く理解するためにのみ文字列変換を避けることを望んでいました。 +1の教育的側面。私が次の週末までに何をしているのか分からないなら、私はこの(または別の)答えを受け入れるでしょう。ありがとう。 – Jeff

関連する問題