2017-06-21 14 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

要件に応じて2通りの方法があります。


あなたが列挙するタイプを必要としない場合は、単にこれは、任意のハッシュ可能タイプが使用できるようになります

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

を行うことができます。


あなたはRawValueがあなたの動物の種類が準拠する必要があります別のプロトコルを定義する必要がありますStringですタイプのみRawRepresentableことができることを必要とする場合。

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

私は第二のアプローチに行きました。 '' static func ==(lhs:Self、rhs:Self)」のようなプロトコル拡張でうまく動作します。 ) - > Bool {return lhs.storage == rhs.storage} ' – zekel

関連する問題