2016-09-09 5 views
0

Я пытаюсь выполнить следующее в Swift - я хочу передать тип в общую функцию «get» и на основе этого типа и параметра использовать разные репозитории для возврата класс.Фабрика в Swift с использованием общих типов

Я признаю, что это немного странно, чтобы сделать это, но это сэкономит мне много времени и позволит мне более правильно реорганизовать что-то позже. Вот код, но он компилирует ошибки в строках Foo1Repository и Foo2Repository «Невозможно преобразовать тип Foo1Repository в T».

В основном Foo1Repository должен возвращать Foo1, который наследуется от BaseEntity конечно (и то же самое верно и для Foo2)

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

Итак, вы можете видеть, целое как! Т в конце был ключевым. Также == вместо того, чтобы проверять тип.

Смежные вопросы