Это мой код:
enum Pet {
case dog(Int), cat(String)
}
protocol PetHolder {
associatedtype Food
func determineFood(from: Pet) -> Food?
}
struct DogHolder: PetHolder {
typealias Food = Int
func determineFood(from: Pet) -> Int? {
// Possible one liner? Enum extension?
switch from {
case .dog(let food):
return food
default:
return nil
}
}
}
В реальном коде Pet
- это сгенерированное огромное перечисление. У нас есть много классов, таких как DogHolder, которые должны извлекать данные, основанные на связанном типе случая в Pet
.
Невозможно написать для каждого XHolder
следующее (как показано выше):
// Possible one liner? Enum extension?
switch from {
case .dog(let food):
return food
default:
return nil
}
}
Это приведет к сотням строк, в которых только case .dog(let food):
будет другим.
Я хочу посмотреть, содержит ли он конкретный случай, и вернуть тот единственный тип перечисления, который в точности совпадает с ассоциированным типом протокола, который он реализует. Enum Pet всегда имеет одно ассоциированное значение (опять же, оно точно соответствует протоколу, который реализует объект).
Edit:
Я получил это сейчас, но могу ли я удалить else if и встроить возможное значение nil?
if case let Pet.dog(food) = from {
return food
} else {
return nil
}