我意识到 static
变量是隐式的 lazy
,这真的很棒。在第一次调用之前,执行以下操作不会创建实例:
static var test = Test()
但是,将新实例分配给
static
变量会初始化原始实例,然后分配给我带来麻烦的新实例:SomeType.test = AnotherTest() //Initializes Test then AnotherTest type
为了提供更多关于我正在尝试做的事情的上下文,我正在尝试使用 this article 设置纯 Swift 依赖项注入(inject)。在我的单元测试中交换类型时效果不佳,因为在分配模拟类型时原始类型总是被初始化。
这是一个更完整的游乐场示例:
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
? 最佳答案
您需要延迟加载。试试这个:
struct MyMap {
private static var _prop1: MyProtocol?
static var prop1: MyProtocol {
get { return _prop1 ?? MyClass() }
set(value) { _prop1 = value }
}
}
或这个:
struct MyMap {
private static var _prop1: MyProtocol?
static var prop1: MyProtocol {
get {
if _prop1 == nil {
_prop1 = MyClass()
}
return _prop1!
}
set(value) { _prop1 = value }
}
}
关于swift - 设置惰性静态变量首先初始化然后分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43373932/