Eu tenho o seguinte enum.
enum EstimateItemStatus: Printable {
case Pending
case OnHold
case Done
var description: String {
switch self {
case .Pending: return "Pending"
case .OnHold: return "On Hold"
case .Done: return "Done"
}
}
init?(id : Int) {
switch id {
case 1:
self = .Pending
case 2:
self = .OnHold
case 3:
self = .Done
default:
return nil
}
}
}
Preciso obter todos os valores brutos como uma matriz de strings (assim ["Pending", "On Hold", "Done"]
).
Eu adicionei esse método ao enum.
func toArray() -> [String] {
var n = 1
return Array(
GeneratorOf<EstimateItemStatus> {
return EstimateItemStatus(id: n++)!.description
}
)
}
Mas estou recebendo o seguinte erro.
Não é possível encontrar um inicializador para o tipo 'GeneratorOf' que aceita uma lista de argumentos do tipo '(() -> _)'
Existe uma maneira mais fácil, melhor ou mais elegante de fazer isso?
Respostas:
Para Swift 4.2 (Xcode 10) e posterior
Existe um
CaseIterable
protocolo:Para Swift <4,2
Não, você não pode consultar um
enum
para saber quais valores ele contém. Veja este artigo . Você deve definir uma matriz que liste todos os valores que você possui. Verifique também a solução de Frank Valbuena em " Como obter todos os valores enum como uma matriz ".fonte
Swift 4.2 apresenta um novo protocolo denominado
CaseIterable
que quando você está em conformidade, você pode obter uma matriz de
enum
casos como estefonte
Adicione o protocolo CaseIterable ao enum:
Uso:
fonte
Há outra maneira que pelo menos é segura no momento da compilação:
Observe que isso funciona para qualquer tipo de enum (RawRepresentable ou não) e também se você adicionar um novo caso, receberá um erro do compilador, o que é bom, pois o forçará a atualizá-lo.
fonte
Encontrei em algum lugar este código:
Usar:
retornar lista de casos de YourEnum
fonte
Para obter uma lista para fins funcionais, use a expressão
EnumName.allCases
que retorna um array, por exemplolhe dará uma lista de Strings, dado que
EnumName: String, CaseIterable
Nota: use em
allCases
vez deAllCases()
.fonte
["Pendente", "OnHold", "Concluído"]
fonte
Atualização para Swift 5
A solução mais fácil que encontrei é usar
.allCases
em um enum que estendeCaseIterable
.allCases
em qualquerCaseIterable
enum retornará umCollection
desse elemento.mais informações sobre CaseIterable
fonte
case OnHold = "On Hold"
e isso se torna o valor bruto para cada um.Para Swift 2
Para usá-lo:
fonte
hashValue
seriam0..n
?Após inspiração de Sequence e horas de erros try n. Eu finalmente consegui este modo confortável e bonito do Swift 4 no Xcode 9.1:
Uso:
Resultado:
fonte
Você pode usar
fonte
Se seu enum for incremental e associado a números, você pode usar o intervalo de números que mapeia para valores de enum, assim:
Isso não funciona muito bem com enums associados a strings ou qualquer coisa diferente de números, mas funciona muito bem se for o caso!
fonte
Extensão em um enum para criar allValues.
fonte