Ich habe die folgende Aufzählung.
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
}
}
}
Ich muss alle Rohwerte als Array von Strings erhalten (wie so ["Pending", "On Hold", "Done"]
).
Ich habe diese Methode zur Aufzählung hinzugefügt.
func toArray() -> [String] {
var n = 1
return Array(
GeneratorOf<EstimateItemStatus> {
return EstimateItemStatus(id: n++)!.description
}
)
}
Aber ich erhalte den folgenden Fehler.
Es kann kein Initialisierer für den Typ 'GeneratorOf' gefunden werden, der eine Argumentliste vom Typ '(() -> _)' akzeptiert.
Gibt es eine einfachere, bessere oder elegantere Möglichkeit, dies zu tun?
Antworten:
Für Swift 4.2 (Xcode 10) und höher
Es gibt ein
CaseIterable
Protokoll:Für Swift <4.2
Nein, Sie können nicht abfragen,
enum
welche Werte darin enthalten sind. Siehe diesen Artikel . Sie müssen ein Array definieren, das alle Ihre Werte auflistet. Lesen Sie auch die Lösung von Frank Valbuena unter " So erhalten Sie alle Enum-Werte als Array ".quelle
Swift 4.2 führt ein neues Protokoll mit dem Namen ein
CaseIterable
Wenn Sie sich an die Anforderungen halten, können Sie aus
enum
solchen Fällen ein Array abrufenquelle
Fügen Sie das CaseIterable- Protokoll zur Aufzählung hinzu:
Verwendung:
quelle
Es gibt noch einen anderen Weg, der zumindest beim Kompilieren sicher ist:
Beachten Sie, dass dies für jeden Aufzählungstyp (RawRepresentable oder nicht) funktioniert. Wenn Sie einen neuen Fall hinzufügen, wird ein Compilerfehler angezeigt, der gut ist, da Sie gezwungen sind, diesen auf den neuesten Stand zu bringen.
quelle
Ich habe irgendwo diesen Code gefunden:
Verwenden:
Liste der Fälle von YourEnum zurückgeben
quelle
Verwenden Sie den Ausdruck,
EnumName.allCases
der ein Array zurückgibt, zwird Ihnen eine Liste von Strings geben, wenn das gegeben ist
EnumName: String, CaseIterable
Hinweis: Verwenden Sie
allCases
anstelle vonAllCases()
.quelle
["Ausstehend", "OnHold", "Fertig"]
quelle
Update für Swift 5
Die einfachste Lösung, die ich gefunden habe, besteht darin, sie
.allCases
für eine erweiterte Aufzählung zu verwendenCaseIterable
.allCases
Bei jederCaseIterable
Aufzählung wird einCollection
Element dieses Elements zurückgegeben.Weitere Informationen zu CaseIterable
quelle
case OnHold = "On Hold"
und das wird der Rohwert für jeden.Für Swift 2
Um es zu benutzen:
quelle
hashValue
sein0..n
?Nach Inspiration von Sequence und stundenlangem Versuch n Fehler. Ich habe endlich diesen komfortablen und schönen Swift 4 Way auf Xcode 9.1 bekommen:
Verwendung:
Ausgabe:
quelle
Sie können verwenden
quelle
Wenn Ihre Aufzählung inkrementell ist und Zahlen zugeordnet ist, können Sie einen Zahlenbereich verwenden, den Sie Aufzählungswerten zuordnen, z.
Dies funktioniert nicht ganz mit Aufzählungen, die mit Zeichenfolgen oder anderen Elementen als Zahlen verknüpft sind, aber es funktioniert hervorragend, wenn dies der Fall ist!
quelle
Erweiterung einer Aufzählung zum Erstellen von allValues.
quelle