Hier ist eine Methode, die ich verwende, um sowohl ein enum
zu durchlaufen als auch mehrere Werttypen aus einem enum
zu erhalten
enum IterateEnum: Int {
case Zero
case One
case Two
case Three
case Four
case Five
case Six
case Seven
//Ein Tuple ermöglicht es, mehrere Werte aus dem Enum-Fall abzuleiten, und
//da es ein Switch ohne Default verwendet, wird ein Compilerfehler zurückgegeben, wenn ein neuer Fall hinzugefügt wird,
//aber kein Wert-Tupel festgelegt ist
var value: (french: String, spanish: String, japanese: String) {
switch self {
case .Zero: return (french: "zéro", spanish: "cero", japanese: "nuru")
case .One: return (french: "un", spanish: "uno", japanese: "ichi")
case .Two: return (french: "deux", spanish: "dos", japanese: "ni")
case .Three: return (french: "trois", spanish: "tres", japanese: "san")
case .Four: return (french: "quatre", spanish: "cuatro", japanese: "shi")
case .Five: return (french: "cinq", spanish: "cinco", japanese: "go")
case .Six: return (french: "six", spanish: "seis", japanese: "roku")
case .Seven: return (french: "sept", spanish: "siete", japanese: "shichi")
}
}
//Wird verwendet, um das Enum zu durchlaufen oder anderweitig auf den Enum-Fall nach Indexreihenfolge zuzugreifen.
//Durchlauf durch Schleife, bis nil zurückgegeben wird
static func item(index: Int) -> IterateEnum? {
return IterateEnum.init(rawValue: index)
}
static func numberFromSpanish(number: String) -> IterateEnum? {
return findItem { $0.value.spanish == number }
}
//Block verwenden, um den Wert der Eigenschaft zu testen, um den Enum-Fall abzurufen
static func findItem(predicate: ((_: IterateEnum) -> Bool)) -> IterateEnum? {
var enumIndex: Int = -1
var enumCase: IterateEnum?
//Bis zum Nullpunkt durchlaufen
repeat {
enumIndex += 1
enumCase = IterateEnum.item(index: enumIndex)
if let eCase = enumCase {
if predicate(eCase) {
return eCase
}
}
} while enumCase != nil
return nil
}
}
var enumIndex: Int = -1
var enumCase: IterateEnum?
// Durchlauf durch Schleife, bis nil zurückgegeben wird
repeat {
enumIndex += 1
enumCase = IterateEnum.item(index: enumIndex)
if let eCase = enumCase {
print("Die Zahl \(eCase) auf Französisch: \(eCase.value.french), spanisch: \(eCase.value.spanish), japanisch: \(eCase.value.japanese)")
}
} while enumCase != nil
print("Insgesamt \(enumIndex) Fälle")
let number = IterateEnum.numberFromSpanish(number: "siete")
print("siete auf Japanisch: \((number?.value.japanese ?? "Unbekannt"))")
Dies ist die Ausgabe:
Die Zahl Zero auf Französisch: zéro, spanisch: cero, japanisch: nuru
Die Zahl One auf Französisch: un, spanisch: uno, japanisch: ichi
Die Zahl Two auf Französisch: deux, spanisch: dos, japanisch: ni
Die Zahl Three auf Französisch: trois, spanisch: tres, japanisch: san
Die Zahl Four auf Französisch: quatre, spanisch: cuatro, japanisch: shi
Die Zahl Five auf Französisch: cinq, spanisch: cinco, japanisch: go
Die Zahl Six auf Französisch: six, spanisch: seis, japanisch: roku
Die Zahl Seven auf Französisch: sept, spanisch: siete, japanisch: shichi
Insgesamt 8 Fälle
siete auf Japanisch: shichi
UPDATE
Ich habe kürzlich ein Protokoll erstellt, um die Aufzählung zu behandeln. Das Protokoll erfordert ein Enum mit einem Int-Rohwert:
protocol EnumIteration {
//Wird verwendet, um die Aufzählung zu durchlaufen oder anderweitig auf den Enum-Fall nach Indexreihenfolge zuzugreifen. Durchlauf durch Schleife, bis nil zurückgegeben wird
static func item(index:Int) -> Self?
static func iterate(item:((index:Int, enumCase:Self)->()), completion:(()->())?)
static func findItem(predicate:((enumCase:Self)->Bool)) -> Self?
static func count() -> Int
}
extension EnumIteration where Self: RawRepresentable, Self.RawValue == Int {
//Wird verwendet, um die Aufzählung zu durchlaufen oder anderweitig auf den Enum-Fall nach Indexreihenfolge zuzugreifen. Durchlauf durch Schleife, bis nil zurückgegeben wird
static func item(index:Int) -> Self? {
return Self.init(rawValue: index)
}
static func iterate(item:((index:Int, enumCase:Self)->()), completion:(()->())?) {
var enumIndex:Int = -1
var enumCase:Self?
//Durchlauf bis nil zurückgegeben wird
repeat {
enumIndex += 1
enumCase = Self.item(enumIndex)
if let eCase = enumCase {
item(index: enumIndex, enumCase: eCase)
}
} while enumCase != nil
completion?()
}
static func findItem(predicate:((enumCase:Self)->Bool)) -> Self? {
var enumIndex:Int = -1
var enumCase:Self?
//Durchlauf, bis nil zurückgegeben wird
repeat {
enumIndex += 1
enumCase = Self.item(enumIndex)
if let eCase = enumCase {
if predicate(enumCase:eCase) {
return eCase
}
}
} while enumCase != nil
return nil
}
static func count() -> Int {
var enumIndex:Int = -1
var enumCase:Self?
//Durchlauf, bis nil zurückgegeben wird
repeat {
enumIndex += 1
enumCase = Self.item(enumIndex)
} while enumCase != nil
//letzter enumIndex (wenn enumCase == nil) entspricht der Anzahl der Enumerationen
return enumIndex
}
}