我意识到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
?
答案 0 :(得分:2)
你需要延迟加载。试试这个:
result
或者这个:
struct MyMap {
private static var _prop1: MyProtocol?
static var prop1: MyProtocol {
get { return _prop1 ?? MyClass() }
set(value) { _prop1 = value }
}
}