Внедрение контроллера представления из раскадровки с использованием тайфуна и Swift

Как правильно внедрить UIViewController, созданный из UIStoryboard, используя Typhoon и swift?

Я не могу найти каких-либо четких примеров этого ни в одном из примеров приложений, и когда я перевожу код Objective C из документации, возникает исключение.

Ниже приведен код из моей AppAssembly:

public dynamic func loginViewController() -> LoginViewController {
    return TyphoonDefinition.withClass(LoginViewController.self) {
        (definition) in

        definition.injectProperty("socialClient",with:self.coreComponents.socialClient())
        //definition.scope = TyphoonScope.Singleton
    } as LoginViewController
}

И это исключение, которое выбрасывается:

0x10636ca1c:  jne    0x10636ca10               ; swift_dynamicCastClassUnconditional + 48
0x10636ca1e:  leaq   0x36b3d(%rip), %rax       ; "Swift dynamic cast failed"
0x10636ca25:  movq   %rax, 0xb4a2c(%rip)       ; gCRAnnotations + 8
0x10636ca2c:  int3   
0x10636ca2d:  movq   %rdi, %rax
0x10636ca30:  popq   %rbp
0x10636ca31:  retq   
0x10636ca32:  nopw   %cs:(%rax,%rax)

"Сбой динамического приведения Swift" приводит меня к мысли, что то, что было возможно при использовании Objective C, просто невозможно при использовании Swift.

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

2 ответа

Решение

Следующие правила применяются с использованием тайфуна в Swift и Objective-C:

  • Во время сборки ваши интерфейсы сборки возвращают рецепты для сборки экземпляра объекта. Это включает в себя настройку вместе со всеми сотрудничающими компонентами.
  • Во время выполнения интерфейс сборки возвращает компоненты, созданные в соответствии с этими рецептами.

Однако есть важное различие между Тайфуном Objective-C и Тайфуном Свифтом:

Objective-C:

  • В Objective-C мы рекомендуем, чтобы ваши интерфейсы сборки объявляли возвращаемый тип, который будет построен, поскольку это обеспечивает лучшее завершение кода и позволяет избежать ненужного преобразования.
  • В Objective-C вы можете иметь любой из ваших интерфейсов сборки "поза" перед TyphoonComponentFactory просто приведя его к одному из ваших интерфейсов сборки.

Swift:

  • К сожалению, в Swift ваши методы сборки должны возвращать тип AnyObject, Строгая проверка типов Swift не позволит иначе. Это показано в кратком руководстве для Swift.
  • В Свифте невозможно разыграть TyphoonComponentFactory к одному из интерфейсов сборки. Однако все еще возможно ввести сборку в компонент следующим образом:

Внедрение сборки:

dynamic func appDelegate() -> AnyObject {
    return TyphoonDefinition.withClass(AppDelegate.self) {
        (definition) in

        //The type of this property can be TyphoonComponentFactory or any of your 
        //assembly interfaces. 
        definition.injectProperty("assembly", with: self)
    }
}

Исправление вашей аварии:

Поэтому, чтобы исправить ошибку, следуя приведенным выше условиям, измените код на следующий:

Измените свой код на следующее:

public dynamic func loginViewController() -> AnyObject {
    //etc
}

Разрешение компонентов из раскадровки:

Пока ваш тайфун запускается используя интеграцию plist и включает обычный UILaunchStoryboardName а также UIMainStoryboardFile Тайфун будет гарантировать, что ваша раскадровка является экземпляром TyphoonStoryboard это работает как обычная раскадровка с добавленным поведением, согласно которому зависимости вводятся в соответствии с правилами в вашей сборке.

Документация по этой функции находится здесь.

Следующие функции будут в ближайшее время:

Чтобы ответить на мой собственный вопрос и для всех остальных, кто сталкивался с той же проблемой, убедитесь, что ваш модуль установлен, и обратите особое внимание на журнал консоли, любые ошибки, которые могут содержать "неизвестный контроллер представления"

В вашей ApplicationAssembly не приводите контроллер представления к его строгому типу, оставьте его как AnyObject, как указано в документации.

Интерфейсный Разработчик

Спасибо авторам Typhoon за написание такого потрясающего фреймворка!

Другие вопросы по тегам