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