Развертывание связанного значения для всех случаев в коммутаторе
У меня есть перечисление, подобное этому, где все случаи содержат одинаковое значение content
:
enum RowType {
case single(_ content: [Any])
case double(_ content: [Any])
case triple(_ content: [Any])
...
}
Я знаю, я мог бы просто использовать struct
с rowType
и content
атрибут, но давайте, пожалуйста, не будем обсуждать это, а посмотрим на следующее: Когда я хочу переключить все случаи, я, конечно, могу сделать это:
switch row {
case .single(let content):
// do anything
break
case .double(let content):
// ...
...
}
или даже:
switch row {
case .single(let content), .double(let content), ...:
// do the same thing for all cases
break
}
Теперь мое перечисление содержит еще несколько случаев и, вероятно, будет расти в процессе разработки, поэтому мне неудобно перечислять все случаи в одном и том же case
Заявление просто развернуть content
аргумент.
Так что мне стало любопытно и я удивился: могу ли я как-то "подстановить" сам случай enum и все же развернуть content
поле? Как default
случай со связанным значением...
Я надеялся, что смогу сделать что-то вроде...
switch row {
case _(let content):
// do something
break
}
... или может получить доступ к связанному значению в случае по умолчанию.
Я провел небольшое исследование, но не смог найти ответ, поэтому я рад вашим мыслям.
0 ответов
Попробуйте это на игровой площадке.
enum RowType {
case single(_ content: [Any])
case double(_ content: [Any])
case triple(_ content: [Any])
case noVal
var associatedValue: Any? {
get {
let mirror = Mirror(reflecting: self)
if let associated = mirror.children.first {
return associated.value
}
print("WARNING: Enum option of \(self) does not have an associated value")
return nil
}
}
}
let row : RowType = .double([1,2,3])
let rowNoVal : RowType = .noVal
row.associatedValue
rowNoVal.associatedValue