Получить 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 }
}