Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift UIViewController子类中的非可选变量_Swift - Fatal编程技术网

swift UIViewController子类中的非可选变量

swift UIViewController子类中的非可选变量,swift,Swift,我希望rentalService变量是非可选的。i、 没有这项服务,你不可能有一个租赁公司。然而,我不得不声明init(NSCoder)——但此时我没有访问租赁服务实现的权限 Rentals是一个协议,我正在使用依赖项注入,因此不需要在类中创建依赖项 有人有什么聪明的想法来克服这个问题吗?或者什么是首选模式/最佳实践 根据您使用的DI框架,我将通过使用setter注入而不是构造函数注入来修复它 在这种情况下,您必须在初始化时为属性提供初始假值,或者将属性转换为可选值。在后一种情况下,我将其声明为

我希望rentalService变量是非可选的。i、 没有这项服务,你不可能有一个租赁公司。然而,我不得不声明init(NSCoder)——但此时我没有访问租赁服务实现的权限

Rentals是一个协议,我正在使用依赖项注入,因此不需要在类中创建依赖项


有人有什么聪明的想法来克服这个问题吗?或者什么是首选模式/最佳实践

根据您使用的DI框架,我将通过使用setter注入而不是构造函数注入来修复它

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

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
    }

}
避免在每次使用时显式展开

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

var rentalService: Rentals!

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

如果您不想支持NSCoding,可以这样做:

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

正如这里所提到的:

我没有使用DI框架,只是使用我自己的框架。另外,我不喜欢setter注入——我喜欢对象只能在初始化期间以有效状态构造的概念。您自己的DI框架看起来是一种有趣的技术,我想看一个静态链接应用程序初始化的示例,以及它如何在单元测试中切换。感谢幸运的是,我不能提供任何代码,因为我没有发布它的权限(这不是我自己的项目)。我可以这样说,我用如下代码将接口绑定到实例:
injector.bindInterface(IRouter.self,toImplementation:Router.self,asSingleton:true){Router()}
。然而,这个DI库有一个严重的限制:它只与objc兼容的类一起工作(因此不使用泛型等)。在测试中,如果需要,我只需将接口绑定到另一个类。谢谢你,谢谢你。这就是我最后做的,因为我不支持NSCoding-我的ViewController需要使用它的默认init方法和它的依赖项来构造,所以它不会通过nib文件加载/未归档。没问题,很高兴它能工作!如果它解决了您的问题,请确保接受;)
required init(coder: NSCoder) {
  fatalError("NSCoding not supported")
}