Регистрация контейнера Swinject не удалась - PullRequest
0 голосов
/ 23 мая 2018

При попытке связать некоторые протоколы с различными классами я столкнулся со странным поведением в форме получения нулевого значения в протоколах.Это класс инжектора зависимостей:

class DependencyInjector: NSObject {

    let container: Container

    override init() {
        container = Container()
        super.init()
        register()
    }
}

extension DependencyInjector {

    func register() {
        container.register(NetworkProtocols.self) { _ in ApiManager() }.inObjectScope(.container)
        container.register(ConnectivityManager.self) { r in
            let controller = ConnectivityManager()
            controller.network = r.resolve(NetworkProtocols.self)
            return controller
        }

        container.storyboardInitCompleted(ChooseCameraViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }

        container.storyboardInitCompleted(InstallationViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }

        container.storyboardInitCompleted(CameraSetupViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }

        container.storyboardInitCompleted(LoginViewController.self) { r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }
    }
} 

Это AppDelegate:

var dependencyInjector: DependencyInjector!

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.        
    dependencyInjector = DependencyInjector()

    let window = UIWindow(frame: UIScreen.main.bounds)
    self.window = window
    let bundle = Bundle(for: ViewController.self)
    let storyboard = SwinjectStoryboard.create(name: "Main", bundle: bundle, container: dependencyInjector.container)
    window.rootViewController = storyboard.instantiateInitialViewController()

    return true
}

В приведенном ниже классе я получаю nil в свойстве протокола:

class ConnectivityManager: NSObject {

    var network: NetworkProtocols!

    func connectHotSpot() {
        self.network.whoAmI(success: {
            print("api succses")
        }, failure: { (error) in
            print(error.localizedDescription)
        })
    }
}

Сетевая переменная всегда nil, тогда как в других классах, использующих storyboardInitCompleted, сетевая переменная работает.Хотелось бы услышать, если я делаю что-то не так, спасибо заранее!

1 Ответ

0 голосов
/ 27 мая 2018

Так что мне удалось найти ответ.Как сказал @JakubVano, мне нужно было получить экземпляр ConectivityManager, так что я сделал:

    container.register(ConnectivityManager.self) { r in
        let controller = ConnectivityManager()
        controller.network = r.resolve(NetworkProtocols.self)
        return controller
    }

   container.storyboardInitCompleted(ChooseCameraViewController.self) {r,c in
    c.connectivityManager = r.resolve(ConnectivityManager.self)!

    }
...