Obtenga rawValue de enum en una función genérica

Actualización 28/08/2015: Esto se resolverá en Swift 2

VerRespuesta de Twitter del desarrollador del compilador Swift

Actualización 23/10/2015: Con los genéricos Swift 2 aún no puede obtener el RawValue. Puede obtener el valor asociado.

Pregunta original

tengo algunoscódigo genérico de reflexión escrito en rápido. En ese código, tengo problemas para obtener el valor de las propiedades que se basan en una enumeración. El problema se reduce al hecho de que no puedo ejecutar el.rawValue en el valor de la propiedad que es de tipoAny. El código de reflexión rápida devolverá el valor de la enumeración como tipoAny. Entonces, ¿cómo puedo pasar de un Any a un AnyObject que es el RawValue del enum.

La única solución que he encontrado hasta ahora es extender todas las enumeraciones con un protocolo. A continuación puede ver una prueba unitaria que está bien con esta solución alternativa.

¿Hay alguna forma de resolver esto sin agregar código a la enumeración original?

para mi código de reflexión necesito elgetRawValue firma del método para permanecer como está.

class WorkaroundsTests: XCTestCase {
    func testEnumToRaw() {
        let test1 = getRawValue(MyEnumOne.OK)
        XCTAssertTrue(test1 == "OK", "Could nog get the rawvalue using a generic function")
        let test2 = getRawValue(MyEnumTwo.OK)
        XCTAssertTrue(test2 == "1", "Could nog get the rawvalue using a generic function")
        let test3 = getRawValue(MyEnumThree.OK)
        XCTAssertTrue(test3 == "1", "Could nog get the rawvalue using a generic function")
    }


    enum MyEnumOne: String, EVRawString {
        case NotOK = "NotOK"
        case OK = "OK"
    }

    enum MyEnumTwo: Int, EVRawInt {
        case NotOK = 0
        case OK = 1
    }

    enum MyEnumThree: Int64, EVRaw {
        case NotOK = 0
        case OK = 1
        var anyRawValue: AnyObject { get { return String(self.rawValue) }}
    }

    func getRawValue(theEnum: Any) -> String {
        // What can we get using reflection:
        let mirror = reflect(theEnum)
        if mirror.disposition == .Aggregate {
            print("Disposition is .Aggregate\n")

            // OK, and now?

            // Thees do not complile:
            //return enumRawValue(rawValue: theEnum)
            //return enumRawValue2(theEnum )

            if let value = theEnum as? EVRawString {
                return value.rawValue
            }
            if let value = theEnum as? EVRawInt {
                return String(value.rawValue)
            }
        }
        var valueType:Any.Type = mirror.valueType
        print("valueType = \(valueType)\n")
        // No help from these:
        //var value = mirror.value  --> is just theEnum itself
        //var objectIdentifier = mirror.objectIdentifier   --> nil
        //var count = mirror.count   --> 0
        //var summary:String = mirror.summary     --> "(Enum Value)"
        //var quickLookObject = mirror.quickLookObject --> nil

        let toString:String = "\(theEnum)"
        print("\(toString)\n")
        return toString
    }

    func enumRawValue<E: RawRepresentable>(rawValue: E.RawValue) -> String {
        let value = E(rawValue: rawValue)?.rawValue
        return "\(value)"
    }

    func enumRawValue2<T:RawRepresentable>(rawValue: T) -> String {
        return "\(rawValue.rawValue)"
    }

}

    public protocol EVRawInt {
        var rawValue: Int { get }
    }
    public protocol EVRawString {
        var rawValue: String { get }
    }
    public protocol EVRaw {
        var anyRawValue: AnyObject { get }
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta