swift UIViewController子类中的非可选var

时间:2014-10-14 16:55:24

标签: swift

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) - 但此时我无法访问租赁服务实施。

租赁是一种协议,我使用依赖注入 - 所以没有人在类中创建依赖。

任何人都有任何聪明的想法来克服这个问题?或者什么是优先模式/最佳实践?

2 个答案:

答案 0 :(得分:1)

如果您不想支持NSCoding,则可以执行此操作:

required init(coder: NSCoder) {
  fatalError("NSCoding not supported")
}

如此处所述:https://stackoverflow.com/a/25128815/2611971

答案 1 :(得分:-1)

根据您使用的DI框架,我修复它的方法是使用setter注入而不是构造函数注入。

在这种情况下,您必须在初始化时向属性提供初始伪值,或者将属性转换为可选。在后一种情况下,我将其声明为隐式解包:

var rentalService: Rentals!

避免在每次使用时明确展开。

我在自己的DI框架中使用的另一个解决方案是懒惰和内联初始化属性,例如:

private lazy var _router: IRouter = { Injector.instance.instanceForType(IRouter.self) as IRouter }()

这里我知道界面,我要求注射器为我提供一个绑定类型的实例。在应用程序初始化期间,我将接口静态链接到实现。