2017-07-12 1 views
0

sah ich diese Antwort How to enumerate an enum with String type?Erhalten generischen Array von RawRepresentable von AnyIterator

Jetzt versuche ich, Verfahren zu schaffen, das Array von Strings mit den Rohwerten der Enumeration zurück.

Also habe ich:

class func enumValues<T>(from array: AnyIterator<T>) -> [T] where T:RawRepresentable, T:Hashable { 
    var tempArray = [T]() 
    for item in array{ 
     tempArray.append(item.rawValue) 
    } 
    return tempArray 
} 

Aber ich bekomme diese Fehlermeldung:

Argument Typ 'T.RawValue' entspricht nicht erwarteten Typ 'Hashable'

Argument Typ 'T.RawValue' entspricht nicht dem erwarteten Typ 'RawRepresentable'

Wie kann ich dieses Problem beheben? Dank

Antwort

1

Sie wollen ein Array mit den Rohwerten der Array-Elemente zurück, so der Rückgabetyp sollte T.RawValue (und die Einschränkung T:Hashable ist nicht erforderlich) sein:

func enumValues<T>(from array: AnyIterator<T>) -> [T.RawValue] where T: RawRepresentable { 
    var tempArray: [T.RawValue] = [] 
    for item in array{ 
     tempArray.append(item.rawValue) 
    } 
    return tempArray 
} 

, die sein kann vereinfacht

func enumValues<T>(from array: AnyIterator<T>) -> [T.RawValue] where T: RawRepresentable { 
    return array.map { $0.rawValue } 
} 

oder allgemeiner für jede Folge von roh-representables:

func enumValues<S: Sequence>(from sequence: S) -> [S.Iterator.Element.RawValue] 
    where S.Iterator.Element: RawRepresentable { 

    return sequence.map { $0.rawValue } 
} 

Auf der anderen Seite kann man sich fragen, ob dies eine separate Funktion überhaupt wert ist, da man map { $0.rawValue } direkt am gegeben Iterator/Sequenz/Array aufrufen können.

Verwandte Themen