Развертывание связанного значения для всех случаев в коммутаторе

У меня есть перечисление, подобное этому, где все случаи содержат одинаковое значение 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
Другие вопросы по тегам