2016-04-20 11 views
1

Ich entwickle eine Funktionalität für zwei Teilmengen des einzelnen Typs. z.B. Früchte. Ich habe zwei Aufzählungen für Früchte, wie unten:Nicht in der Lage, Protokoll als Schlüssel im Wörterbuch in swift zu verwenden

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

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

Um diese beide als einzige Art in meiner Implementierung verwendet ich ein Protokoll verwenden:

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

Hier ist meine Implementierung wie folgt aussieht:

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

Das funktioniert gut, aber wenn ich versuche, es in einer Karte als Schlüssel hinzuzufügen:

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

Es gibt mir eine Fehlermeldung sagt: Type 'Fruit' does not confirm to protocol 'Hashable'. Meine Karte sollte jede (süße oder saure Frucht als Schlüssel) enthalten. Wie man das erreicht.

Ich habe versucht, Hashable in Obst zu implementieren, aber es hat nicht funktioniert. Bitte hilf mir dabei.

+1

'Ich habe versucht, Hashable in Obst zu implementieren, aber es hat nicht funktioniert' Sie sollten uns, was Sie ausprobiert haben. Die Implementierung von Hashable ist der richtige Weg, vielleicht haben Sie etwas falsch gemacht. – Moritz

Antwort

0

Wenn das Protokoll 'Fruits' dem Protokoll 'Hashable' entspricht, kann es nur als generische Einschränkung verwendet werden, da es über Self- oder zugehörige Typanforderungen verfügt.

0

Sie können Protokoll nicht hier verwenden - Protokolle sind nicht wirklich von irgendeinem Typ. Seine gerade Definition. Das Gleiche kann durch die Klasse erreicht werden.

class Fruits : NSObject { 
    } 

Jetzt definieren, Unterklasse der Früchte. Sie können als Teil der Unterklasse enum haben.

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


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

} 

gemeinsam Methode können Sie es wie folgt zugreifen ...

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 
} 

// Sie können Enum direkt mit Klassennamen wie unten verwenden.

func test() 
{ 
    let map: [Fruits : String] = [:] 
    let test = SourFruits.SourFruits.Grape 
}