2017-06-21 187 views
1

我想共享CatZooDogZoo之間的功能,因爲它們正在存儲類似的數據,但我也希望它們知道它們是什麼,以便它們可以處理它們的特定數據,如DogZoo.makeNoise()方法中所示。在Swift中,如何在協議擴展中使用泛型枚舉類型?

什麼是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

有兩種不同的方式可以做到這一點,這取決於您的要求。


如果你不需要類型是一個枚舉,你可以簡單地做

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

這將允許使用任何可哈希類型。


如果您需要的類型只能是RawRepresentableRawValueString你必須定義另一個協議,您的動物類型將必須符合。

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 { ... } 
+0

很好的答案。我採用第二種方法。與以下協議擴展一起使用效果很好:'var isEmpty:Bool {get {return storage.filter {$ 0.value!= 0} .count == 0}}'和'static func ==(lhs:Self,rhs:Self ) - > Bool {return lhs.storage == rhs.storage}' – zekel

相關問題