在Swift中,如何在协议扩展中使用泛型枚举类型?

时间:2017-06-21 19:19:23

标签: swift enums

我希望在CatZooDogZoo之间共享功能,因为它们会在引擎盖下存储类似的数据,但我也希望它们知道它们是什么,以便它们可以对其特定数据采取行动,如DogZoo.makeNoise()方法所示。

AnimalStorageProtocol.storage的正确类型是什么?

enum CatType: String {
    case lion
    case tiger
    case panther
}

enum DogType: String {
    case coyote
    case domestic
    case wolf
}

struct CatZoo: AnimalStorageProtocol {
    private var storage: [CatType: Int] // it's a bonus if they can stay private
}

struct DogZoo: AnimalStorageProtocol {
    private var storage: [DogType: Int]

    func makeNoise() {
        for (key, value) in storage {
            switch key  {
            case .coyote:
                print("\(value) yips!")
            case .domestic:
                print("\(value) barks!")
            case .wolf:
                print("\(value) howls!")
            }
        }
    }
}

我认为我可以定义一个通用的枚举类型in the protocol,但我还没有能够让它工作。

protocol AnimalStorageProtocol {
    // var storage: <RawRepresentable where RawRepresentable.RawValue == String: Int> { get set }
    var storage: [RawRepresentable: Int] { get set }
}

extension AnimalStorageProtocol {
    var isEmpty: Bool {
        get {
            for (_, value) in storage {
                if value != 0 {
                    return false
                }
            }
            return true
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据您的要求,您可以采用两种不同的方式。

如果您不要求类型为枚举,则只需执行

即可
protocol AnimalStorageProtocol {
    associatedtype AnimalType: Hashable
    var storage: [AnimalType: Int] { get set }
}

这将允许使用任何可清洗类型。

如果您要求类型只能RawRepresentable RawValueString,则必须定义您的动物类型必须符合的其他协议。< / p>

protocol AnimalType: Hashable, RawRepresentable {
    var rawValue: String { get }
}

protocol AnimalStorageProtocol {
    associatedtype Animal: AnimalType
    var storage: [Animal: Int] { get set }
}

然后,您只需将枚举类型设置为符合AnimalType协议。

enum CatType: String, AnimalType { ... }
enum DogType: String, AnimalType { ... }