1

我正在为单一类型的两个子集开发一个功能。例如。水果。我有两个水果枚举如下:

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

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

为了在我的实现中使用这两个作为单一类型,我使用了一个协议:

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在 Fruit 中实现,但没有成功。请帮助我。

4

2 回答 2

0

你不能在这里使用协议——协议实际上不是任何类型的......它只是定义。同样的事情可以通过类来实现。

 class Fruits : NSObject {
    }

现在定义水果的子类。您可以将枚举作为子类的一部分。

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
}

//您可以直接使用带有类名的Enum,如下所示。

func test()
{
    let map: [Fruits : String] = [:]
    let  test  = SourFruits.SourFruits.Grape
}
于 2016-10-17T15:23:58.860 回答
-2

如果协议“Fruits”符合协议“Hashable”,则它只能用作通用约束,因为它具有 Self 或相关类型要求。

于 2016-04-20T13:16:51.223 回答