2016-04-20 6 views
1

私はシングルタイプの2つのサブセットの機能を開発しています。例えば。果物。私は以下のように果物のための2つの列挙型を持っている:すぐに辞書のキーとしてプロトコルを使用することができません

enum SourFruits: String { 
    case Grape, Orange, Lemon 
} 

enum SweetFruits: String { 
    case Watermelon, Banana, Apple 
} 

は私がプロトコル使用しています私の実装では、単一の種類としてこれら2を使用するには:ここでは今

protocol Fruits { 
} 
extension SweetFruits: Fruits { 
} 
extension SourFruits: Fruits { 
} 

をである私の実装は次のようになります。

func doCommonOnFruit(fruit: Fruits) { 
    //Do common 
} 
func doSomeThingWithSourFruit(fruit: SourFruits) { 
    doCommonOnFruit(fruit) 
    // Do specific 
} 
func doSomeThingWithSweetFruit(fruit: SweetFruits) { 
    doCommonOnFruit(fruit) 
    // Do specific 
} 

これは正常に動作しますが、私はキーとしてマップにそれを追加しようとすると:

let map: [Fruit : String] = [:] 

エラーメッセージ:Type 'Fruit' does not confirm to protocol 'Hashable'。私の地図には、どんなもの(甘いものや酸っぱいのものかをキーにするもの)これを達成する方法。

フルーツにHashableを実装しようとしましたが、機能しませんでした。これで私を助けてください。

+1

「フルーツでハッシャブルを実装しようとしましたが、機能しませんでした」あなたが試したものを教えてください。 Hashableを実装する方法があります、多分あなたは何か間違っていました。 – Moritz

答えて

0

プロトコル 'Fruits'がプロトコル 'Hashable'に準拠している場合は、自己または関連するタイプ要件があるため、汎用制約としてのみ使用できます。

0

ここでプロトコルを使用することはできません。プロトコルは実際にはどんなタイプのものでもありません。ちょうど定義です。授業を通して同じことが達成できる。

class Fruits : NSObject { 
    } 

フルーツのサブクラスを定義します。サブクラスの一部としてenumを持つことができます。一般的な方法で

class SweetFruits: Fruits { 
    enum SweetFruits: String { 
     case Watermelon, Banana, Apple 
    } 


} 
class SourFruits: Fruits { 
    enum SourFruits: String { 
     case Grape, Orange, Lemon 
    } 

} 

次のようにそれにアクセスすることができます...

func doCommonOnFruit(fruit: Fruits) { 

    if(fruit.isKind(of: SourFruits.classForCoder())) 
    { 

    } 
    if(fruit.isKind(of: SweetFruits.classForCoder())) 
    { 

    } 
    //Do common 
} 
func doSomeThingWithSourFruit(fruit: SourFruits) { 
    doCommonOnFruit(fruit: fruit) 
    // Do specific 
} 
func doSomeThingWithSweetFruit(fruit: SweetFruits) { 
    doCommonOnFruit(fruit: fruit) 
    // Do specific 
} 

//あなたは直接、以下のようにクラス名を列挙を使用することができます。

func test() 
{ 
    let map: [Fruits : String] = [:] 
    let test = SourFruits.SourFruits.Grape 
} 
関連する問題