我希望在CatZoo
和DogZoo
之间共享功能,因为它们会在引擎盖下存储类似的数据,但我也希望它们知道它们是什么,以便它们可以对其特定数据采取行动,如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
}
}
}
答案 0 :(得分:1)
根据您的要求,您可以采用两种不同的方式。
如果您不要求类型为枚举,则只需执行
即可protocol AnimalStorageProtocol {
associatedtype AnimalType: Hashable
var storage: [AnimalType: Int] { get set }
}
这将允许使用任何可清洗类型。
如果您要求类型只能RawRepresentable
RawValue
为String
,则必须定义您的动物类型必须符合的其他协议。< / 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 { ... }