2016-09-09 1 views
0

Swift에서 다음과 같은 작업을 수행하려고합니다. 형식을 일반 "get"함수로 전달하고 해당 형식과 매개 변수를 기반으로 다른 저장소를 사용하여 되돌립니다. 수업.Swift에서 일반 형식을 사용하는 공장

이 방법이 약간 이상하다고 생각하지만, 시간을 많이 절약하고 나중에 좀 더 적절하게 리펙토링 할 수있게 해줍니다. 여기 코드가 있지만 Foo1Repository 및 Foo2Repository 줄의 오류를 컴파일합니다. "Foo1Repository의 형식을 T로 변환 할 수 없습니다."

기본적으로 Foo1Repository 물론 BaseEntity에서 상속 (같은이 FOO2 마찬가지입니다)을 FOO1을 반환해야

class func Get<T: BaseEntity>(id: Int) -> T 
{ 
    if (T is Foo1) { 
     return Foo1Repository.Get(id) 
    } 
    else if (T == Foo2) { 
     return Foo2Repository.Get(id) 
    } 

    return T() 
} 

내가 수행하여이 함수를 호출하는 기대했다 :

let foo = FactoryClass.Get<Foo1>(1) 

나는 즉시 "적절한 저장소를 호출하지 않는 것, 즉"

let foo = Foo1Repository.Get(1) 

그리고 모두 설정되었습니다! 이상한 공장 패턴이 필요 없습니다.

내가 상속 한 코드를 많이 리팩토링하지 않고 위에서 해보려 고합니다. 나는 나중에 적절한 리펙터를 계획하는 것으로 돌아갈 것이다.

그래서 여러 가지를 시도했지만 컴파일러 오류를 지나칠 수는 없습니다. 이게 가능한 일인가요? 아니면 총알을 물고 다른 길로 가야합니까? 정말 고마워!

+0

하나의 질문입니다. 리포지토리 패턴을 구현하려고합니까? 아주 가까이에 있기 때문에. –

+0

그래, Swift의 컨텍스트에서 조금 더 열심히/FMDB/SQLITE를 사용하므로 ORM이 없습니다. – NullHypothesis

답변

0

그래서 알아 냈습니다! 나는 다른 사람들이 이것을하는 방법을 볼 수 있도록 답을 나누고 싶었다. 잘하면 도움이 될 것입니다.

func Get<T: BaseEntity>(id: Int) -> T 
    { 
     if (T.self == Foo1.self) { 
      return Foo1Repository.Get() as! T 
     } 
     else if (T.self == Foo2.self) { 
      return Foo2Repository.Get() as! T 
     } 
     ... 

     return T() 
    } 

전체적으로 볼 수 있습니다! 결국 T가 중요했습니다. 또한 대신에 ==가 형식 검사를위한 것입니다.