设置延迟静态变量首先初始化然后分配?

时间:2017-04-12 15:35:13

标签: swift dependency-injection static lazy-initialization

我意识到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

1 个答案:

答案 0 :(得分:2)

你需要延迟加载。试试这个:

result

或者这个:

struct MyMap {
    private static var _prop1: MyProtocol?
    static var prop1: MyProtocol {
        get { return _prop1 ?? MyClass() }
        set(value) { _prop1 = value }
    }
}