Разберите enum с associated values через switch с привязкой значения и where-условием
Enum Transaction несёт associated values. Реализуйте describe(_:), чтобы он возвращал читаемую строку для каждого вида транзакции.
Требования:
- Связывайте associated значения через
case let— не читайте их постфактум. - Используйте хотя бы одно
where-условие, чтобы крупным депозитам (amount > 1000) дать отдельное сообщение. - Опирайтесь на исчерпываемость — не добавляйте ветку
default.
enum Transaction {
case deposit(amount: Int)
case withdrawal(amount: Int)
case transfer(amount: Int, to: String)
}
func describe(_ t: Transaction) -> String {
// ваш код здесь
}
Допишите реализацию.
Сопоставляйте каждый case с привязкой значения — case let .deposit(amount) — и добавьте where для уточнённой ветки, например case let .deposit(a) where a > 1000. Так как enum конечен, исчерпывающий switch не требует default и укажет на любой необработанный новый case.
- ✗Думают, что associated значения нельзя связать прямо в образце
case - ✗Считают, что исчерпывающий
switchпо enum всё равно требуетdefault - ✗Ставят
where-условие не туда или принимают его за цикл
- →Что делает компилятор, когда вы добавляете case к исчерпывающе разобранному enum?
- →Чем
case letотличается от привязки каждого associated значения по отдельности?
Bind each case's payload with case let and refine one branch with where. All three cases are handled, so no default is needed — and if someone later adds a case, the compiler will error on this switch until it is handled too.
func describe(_ t: Transaction) -> String {
switch t {
case let .deposit(a) where a > 1000:
return "Large deposit of \(a)"
case let .deposit(a):
return "Deposit of \(a)"
case let .withdrawal(a):
return "Withdrawal of \(a)"
case let .transfer(a, to):
return "Transfer of \(a) to \(to)"
}
}
The where branch must precede the plain .deposit branch — switch picks the first matching case top to bottom, so the more specific pattern goes first.