Получить rawValue из enum в универсальной функции

Обновление 28.08.2015: Это будет решено в Swift 2

УвидетьОтвет Twitter от разработчика компилятора Swift

Обновление 23.10.2015: С генериками Swift 2 вы все еще не можете получить rawValue. Вы можете получить соответствующее значение.

Оригинальный вопрос:

у меня есть немногообщий код отражения написано в быстром. В этом коде у меня возникают проблемы с получением значений для свойств, основанных на перечислении. Проблема сводится к тому, что я не могу выполнить.rawValue на значение свойства, которое имеет типAny, Код отражения Swift вернет значение перечисления как типAny, Итак, как я могу получить от Any до AnyObject, который является rawValue перечисления.

Единственный обходной путь, который я нашел, - это расширение всех перечислений протоколом. Ниже вы можете увидеть модульный тест, который можно использовать с помощью этого обходного пути.

Есть ли способ решить эту проблему, не добавляя код к исходному перечислению?

для моего кода отражения мне нужноgetRawValue метод подписи, чтобы остаться как есть.

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 }
    }

Ответы на вопрос(1)

Ваш ответ на вопрос