1
我想共享CatZoo
和DogZoo
之間的功能,因爲它們正在存儲類似的數據,但我也希望它們知道它們是什麼,以便它們可以處理它們的特定數據,如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
}
}
}
很好的答案。我採用第二種方法。與以下協議擴展一起使用效果很好:'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