【发布时间】:2017-04-12 15:35:13
【问题描述】:
我意识到static 变量隐含地是lazy,这真的很棒。在第一次调用之前,执行以下操作不会创建实例:
static var test = Test()
但是,将新实例分配给 static 变量会初始化原始实例,然后分配给我带来困扰的新实例:
SomeType.test = AnotherTest() //Initializes Test then AnotherTest type
为了提供更多关于我正在尝试做的事情的背景信息,我正在尝试使用 this article 设置一个纯 Swift 依赖注入。在我的单元测试中换出类型时效果不佳,因为在分配模拟类型时总是会初始化原始类型。
这是一个更完整的游乐场示例:
protocol MyProtocol { }
class MyClass: MyProtocol {
init() { print("MyClass.init") }
}
////
struct MyMap {
static var prop1: MyProtocol = MyClass()
}
protocol MyInject {
}
extension MyInject {
var prop1: MyProtocol { return MyMap.prop1 }
}
////
class MyMock: MyProtocol {
init() { print("MyMock.init") }
}
// Swapping types underneath first initializes
// original type, then mock type :(
MyMap.prop1 = MyMock()
prints: MyClass.init
prints: MyMock.init
如何让MyMap.prop1 = MyMock()不先初始化原来的MyClass?
【问题讨论】:
标签: swift dependency-injection static lazy-initialization