0
import Swinject

class GenericsAssembly: Assembly {
    func assemble(container: Container) {
        container.register(TabBarController.self) { resolver in
            let split1 = resolver.resolve(SplitViewController.self)!
            let split2 = resolver.resolve(SplitViewController.self)!
            split1.tabBarItem = UITabBarItem(title: "1", image: UIImage(named: "icon-notepad"), selectedImage: nil)
            split2.tabBarItem = UITabBarItem(title: "2", image: UIImage(named: "icon-chat"), selectedImage: nil)
            let controller = TabBarController(view: resolver.resolve(TabBarView.self)!)
            controller.viewControllers = [
                tasksSplitViewController,
                threadsSplitViewController
            ]
            return controller
        }
        container.register(SplitViewController.self) { _ in
            return SplitViewController()
        }
        container.register(TabBarView.self) { _ in
            return TabBarView()
        }
    }
}

And... there is only one TabBarItem at the bottom. Why?

If I use it like this:

let split1 = SplitViewController()
let split2 = SplitViewController()

then everything is fine.;) What is wrong with Swinject here in my implementation?

Bartłomiej Semańczyk
  • 59,234
  • 49
  • 233
  • 358

3 Answers3

3

You could try use this:

container.register(SplitViewController.self, name: "second") { _ in
    return SplitViewController()
}

let split2 = container.resolve(SplitViewController.self, name: "second")

in other way container will return already resolved controller

svvoff
  • 289
  • 2
  • 14
1

If you need to resolve two different instances in a single register closure, you need to use .transient object scope:

container.register(SplitViewController.self) { _ in SplitViewController() }
    .inObjectScope(.transient)

You can read more about object scopes in the docs.

Jakub Vano
  • 3,833
  • 15
  • 29
0

I added both "name" and "inObjectScope" and it worked for me. Check below my working sample

 var container = Container()

 container.register(ApiClientProtocol.self, name : "ApiClientInstance") { r in ApiClient()}.inObjectScope(.container)

 container.register(LoginViewModelProtocol.self) { r in LoginViewModel(fetcher: r.resolve(ApiClientProtocol.self, name: "ApiClientInstance")!)
  }

Above LoginViewModel class have singleton object of ApiClient class

Jasmine John
  • 873
  • 8
  • 12