import Foundation
import RentalsService
class RentalsViewController: UIViewController {
var rentalService: Rentals
init(rentalService: Rentals) {
self.rentalService = rentalService
super.init(nibName: "RentalsViewController", bundle: NSBundle.mainBundle())
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) // problem here
}
}
我希望rentService变量是非可选的。也就是说,如果没有这项服务,你就无法租房。但是,我被迫宣布init(NSCoder) - 但此时我无法访问租赁服务实施。
租赁是一种协议,我使用依赖注入 - 所以没有人在类中创建依赖。
任何人都有任何聪明的想法来克服这个问题?或者什么是优先模式/最佳实践?
答案 0 :(得分:1)
如果您不想支持NSCoding,则可以执行此操作:
required init(coder: NSCoder) {
fatalError("NSCoding not supported")
}
答案 1 :(得分:-1)
根据您使用的DI框架,我修复它的方法是使用setter注入而不是构造函数注入。
在这种情况下,您必须在初始化时向属性提供初始伪值,或者将属性转换为可选。在后一种情况下,我将其声明为隐式解包:
var rentalService: Rentals!
避免在每次使用时明确展开。
我在自己的DI框架中使用的另一个解决方案是懒惰和内联初始化属性,例如:
private lazy var _router: IRouter = { Injector.instance.instanceForType(IRouter.self) as IRouter }()
这里我知道界面,我要求注射器为我提供一个绑定类型的实例。在应用程序初始化期间,我将接口静态链接到实现。