Внедрение зависимостей Typhoon и Swift 3: Appdelegate — это не AnyObject

Этот код работает с библиотекой внедрения зависимостей Typhoon (Obj-C) в Swift 2.3, но не в Swift 3:

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var rootViewController: RootViewController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = self.rootViewController
        self.window?.makeKeyAndVisible()

        return true
    }
    ...
}

Сборка приложения:

    public class ApplicationAssembly: TyphoonAssembly {

        public dynamic func config() -> AnyObject {
            return TyphoonDefinition.withConfigName("Configuration.plist")
        }

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

                definition!.injectProperty(#selector(ApplicationAssembly.rootViewController), with: self.rootViewController())
            }
        }
 ...
}

Однако следующая ошибка отображается в ApplicationAssembly для любого файла Swift 3, который, как ожидается, вернет «AnyObject»: «Ни один кандидат «withClass» не создает ожидаемый тип контекстного результата «AnyObject»

Может ли кто-нибудь понять несовместимость кодовой базы Obj-c Typhoon со Swift 3?

Снимок экрана со строкой ошибки


person XyrisKenn    schedule 08.03.2017    source источник
comment
не могли бы вы попробовать с явным приведением   -  person Nazmul Hasan    schedule 08.03.2017
comment
Явное приведение не кажется совместимым: public dynamic func mainUIController() -> AnyObject { return TyphoonDefinition.withClass(MainUIViewController.self) as! AnyObject { (definition) in ...   -  person XyrisKenn    schedule 08.03.2017


Ответы (1)


Возможно, вы захотите изменить тип возвращаемого значения с AnyObject на Any.

Функция withClass возвращает тип идентификатора в Objective-C, см. исходный код:

+ (id)withClass:(Class)clazz block:(TyphoonBlockDefinitionInitializerBlock)block;

Тип id раньше сопоставлялся с AnyObject в Swift 2, но в Swift 3 он сопоставляется с Any для большей гибкости. Подробнее об этом изменении можно прочитать здесь.

person João Souza    schedule 09.03.2017