2016-10-17 7 views
1

나는 구문을 찾을 수없는,하지만 난 이런 일을하고 싶지 :일반적으로 열거 형을 유추하고 제한 할 수 있습니까?

class MyClass { 
    let stringValue: String // filled in later 
    let integerValue: Int // filled in later 

    init(stringValue: String) { 
     self.stringValue = stringValue 
     self.integerValue = stringValue.hashValue 
    } 

    init(integerValue: Int) { 
     self.integerValue = integerValue 
     self.stringValue = String(integerValue) 
    } 
} 

extension MyClass { 
    //      This is invalid syntax, but I think you can understand 
    //   vvvvvvvvv I'm trying to give back an enum whose type is inferred 
    var enumValue<T: enum>: T? { 
     get { 
      // This is also invalid; I want to check the type of the enum's raw value 
      if T is String { 
       return T(rawValue: self.stringValue) 
      } else if T is Int { 
       return T(rawValue: self.integerValue) 
      } else { 
       return nil 
      } 
     } 
    } 
} 

사용법은 같은 것입니다 :

enum MyEnum: String { 
    case foo 
    case bar 
} 

func baz(_ some: MyClass) { 
    if let myEnum: MyEnum = some.enumValue { 
     print(myEnum) 
    } 
} 

let some = MyClass(stringValue: "foo") 
baz(some) // prints "foo" 

것은 스위프트이 가능합니까? 즉, 유형이 enum으로 제한되고 사용법에 따라 유추되는 일반 유형의 필드 또는 함수를 사용하려면 해당 값을 사용하여 enum 값을 인스턴스화 하시겠습니까?

답변

1

가능한 솔루션은 일반적인 오버 기능과 같다 :

extension MyClass { 
    func enumValue<T: RawRepresentable>() -> T? where T.RawValue == String { 
      return T(rawValue: stringValue) 
    } 
    func enumValue<T: RawRepresentable>() -> T? where T.RawValue == Int { 
      return T(rawValue: integerValue) 
    } 
} 

다음

대안
func baz(_ some: MyClass) { 
    if let myEnum: MyEnum = some.enumValue() { 
     print(myEnum) 
    } 
} 

이라하고, 인수로 열거 형 합격 :

extension MyClass { 
    func enumValue<T: RawRepresentable>(_ type: T.Type) -> T? where T.RawValue == String { 
      return T(rawValue: stringValue) 
    } 
    func enumValue<T: RawRepresentable>(_ type: T.Type) -> T? where T.RawValue == Int { 
      return T(rawValue: integerValue) 
    } 
} 

그것을

와 같이 부릅니다.
func baz(_ some: MyClass) { 
    if let myEnum = some.enumValue(MyEnum.self) { 
     print(myEnum) 
    } 
} 
+0

아름다운! 거의 정확하게 내가 찾고 있던 것 : D –