Ios 使用Swinject将模型类实例注入Swift中的视图类实例
在XCode 7.0.1中的Swift 2.0单页应用程序项目中,我使用Swift依赖项注入框架执行以下操作: 复制协议.swift:Ios 使用Swinject将模型类实例注入Swift中的视图类实例,ios,swift,dependency-injection,swinject,Ios,Swift,Dependency Injection,Swinject,在XCode 7.0.1中的Swift 2.0单页应用程序项目中,我使用Swift依赖项注入框架执行以下操作: 复制协议.swift: protocol DuplicateProtocol { var id: String { get } } protocol SingletonProtocol { var id: String { get } } SingletonProtocol.swift: protocol DuplicateProtocol { var id: String { g
protocol DuplicateProtocol { var id: String { get } }
protocol SingletonProtocol { var id: String { get } }
SingletonProtocol.swift:
protocol DuplicateProtocol { var id: String { get } }
protocol SingletonProtocol { var id: String { get } }
斯威夫特先生
class DuplicateProxy: DuplicateProtocol {
let id: String
init ( id: String ) {
self.id = "DuplicateProxy." + id
}
}
SingletonProxy.swift:
class SingletonProxy: SingletonProtocol {
let id: String
init ( id: String ) {
self.id = "SingletonProxy." + id
}
}
ViewController.swift:
import UIKit
class ViewController: UIViewController
{
var duplicate: DuplicateProtocol?
var singleton: SingletonProtocol?
required init? ( coder aDecoder: NSCoder ) {
print( "ViewController.init?", duplicate, singleton )
super.init( coder: aDecoder )
}
override func viewDidLoad () {
print( "ViewController.viewDidLoad", duplicate, singleton )
super.viewDidLoad()
}
}
AppDelegate.swift:
import Swinject
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
var window: UIWindow?
func application ( application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]? ) -> Bool {
let container = Container()
let singleton = SingletonProxy( id: "first" )
container.register( SingletonProtocol.self ) { _ in singleton }
container.register( DuplicateProtocol.self ) { _ in DuplicateProxy( id: "second" ) }
container.registerForStoryboard( ViewController.self ) {
r, c in c.duplicate = r.resolve( DuplicateProtocol.self )
}
print( "AppDelegate.application" )
return true
}
}
这是我不幸得到的控制台日志:
ViewController.init? nil nil
AppDelegate.application
ViewController.viewDidLoad nil nil
简单地说:我需要做什么改变?谢谢你,JBM。如果你想从故事板实例化视图控制器,则初始化器注入不可用,因为UIKit框架调用
init?(编码器:)
相反,应该使用属性注入从故事板实例化它:
class SomeViewController: UIViewController {
var duplicate: DuplicateProtocol?
var singleton: SingletonProtocol?
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
}
更新
Swinject仍然不支持UIWindow和初始视图控制器的隐式实例化。您需要像下面的示例那样显式地实例化它们
import Swinject
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var container: Container {
let container = Container()
let singleton = SingletonProxy( id: "first" )
container.register( SingletonProtocol.self ) { _ in singleton }
container.register( DuplicateProtocol.self ) { _ in DuplicateProxy( id: "second" ) }
container.registerForStoryboard( ViewController.self ) {
r, c in c.duplicate = r.resolve( DuplicateProtocol.self )
}
return container
}
func application ( application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]? ) -> Bool {
let window = UIWindow(frame: UIScreen.mainScreen().bounds)
window.makeKeyAndVisible()
self.window = window
let storyboard = SwinjectStoryboard.create(name: "Main", bundle: nil, container: container)
window.rootViewController = storyboard.instantiateInitialViewController()
return true
}
}
顺便说一下,您不必自己处理singleton实例。Swinject具有Singleton(又名容器)对象作用域,可以使用.inObjectScope(.Container)
设置该作用域
更新2
Swinject版本0.3支持从“主”情节提要隐式实例化UIWindow及其根视图控制器 我想添加标记swinject,但我的代表似乎还不够高。我也没有添加标记的特权。如果有人添加swinject标签,这会很有帮助。克劳迪奥,谢谢你添加标签。嗨,Yoichi。我编辑了我的原始问题,既包含了您提出的建议,也发布了一个简单测试项目的全部代码,因为我试图实现您的建议,但没有成功。我确信我做错了什么,这对你来说是显而易见的,但对我来说不是,所以我发布了我的全部精简代码。你让我失去了一点Yoichi,因为你说“如果你想从故事板实例化视图控制器,初始化器注入是不可用的”,然后马上说“属性注入应该用于从故事板实例化它。”那么它是否应该从故事板实例化?您的意思是它应该是:var newViewController=app.storyboard.instanceeviewcontrollerwhiteIdentifier(“ViewController”)-->app.window.rootViewController=newViewController-->app.window.makeyAndVisible()?可以从故事板(SwinjectStoryboard)进行实例化。初始值设定项注入和属性注入的区别在于。希望能有所帮助。很好的Yoichi,谢谢。谢谢你对我愚蠢的问题这么客气。