Я хочу отобразить меню со списком всех возможных вариантов.
То есть вам нужны строки, а не сами случаи. Это абсолютно выполнимо. Во-первых, начните с того, что вы действительно хотите, чтобы тип делал в форме протокола:
protocol CaseNamed {
static var caseNames: [String]
}
Если бы у вас было это, вы могли бы построить то, что вы хотите:
var enums: [CaseNamed.Type] = [A.self, B.self]
enums.flatMap { $0.caseNames }
(я называю это "wi sh управляемой разработкой." У меня будет sh У меня был тип, который мог бы ....)
Теперь вам просто нужно согласовать типы с CaseNamed осуществляя caseNames
. К счастью, это легко, если тип также соответствует CaseIterable:
extension CaseNamed where Self: CaseIterable {
static var caseNames: [String] {
self.allCases.map { "\($0)" }
}
}
Но у вас могут быть типы CaseNamed, которые не соответствуют CaseIterable. CaseIterable не является обязательным требованием. Просто приятно, если он у тебя есть. Вот полный код:
protocol CaseNamed {
static var caseNames: [String] { get }
}
enum A: String, CaseIterable, CaseNamed {
case a1, a2, a3
}
enum B: String, CaseIterable, CaseNamed {
case b1, b2, b3
}
extension CaseNamed where Self: CaseIterable {
static var caseNames: [String] {
self.allCases.map { "\($0)" }
}
}
var enums: [CaseNamed.Type] = [A.self, B.self]
enums.flatMap { $0.caseNames }
Теперь, конечно, вы можете также захотеть, чтобы этот протокол CaseNamed выполнял другие функции, поэтому вы можете добавлять эти другие вещи. Но вам нужно думать с точки зрения вызывающего кода и того, что ему необходимо для выполнения своей работы.