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

10-14 13:28
查看更多