通过将类作为函数参数传递来调用类方法的 Swift 依赖注入(inject)

标签 swift class types dependency-injection

我可能会以错误的方式处理这个问题,但我想引入依赖注入(inject)以进行单元测试,并且为了做到这一点,我需要传递一个类作为参数。在某种伪代码中,它应该如下所示:

protocol LocalSavingProtocol {
    static func saveDataLocally()
}

class ProductionClass: LocalSavingProtocol {
    static func saveDataLocally() {
        print("actually save data")
    }
}

class TestClass: LocalSavingProtocol {
    static func saveDataLocally() {
        print("test saving data")
    }
}

func saveEverywhere(injecting localSavingClass: LocalSavingProtocol = ProductionClass) {
    localSavingClass.saveDataLocally()
}

//production code
saveEverywhere()

//test
saveEverywhere(injecting: TestClass)

显然这不起作用,并且我尝试传递 .Type.self,更改 saveEverywhere 函数至

saveEverywhere<T: LocalSavingProtocol>(injecting localSavingClass: T)

等等,没有任何效果。

目标是建立一个系统:

  1. 我可以在测试代码时注入(inject)一个类
  2. 我不必在生产代码中注入(inject)该类(即有一个默认值)
  3. 我可以在注入(inject)的类上调用类方法

最佳答案

protocol LocalSavingProtocol {
    static func saveDataLocally()
}

class ProductionClass: LocalSavingProtocol {
    class func saveDataLocally() {
        print("actually save data")
    }
}

class TestClass: LocalSavingProtocol {
    class func saveDataLocally() {
        print("test saving data")
    }
}

func saveEverywhere(injecting localSavingClass: LocalSavingProtocol.Type = ProductionClass.self) {
    localSavingClass.saveDataLocally()
}

//production code
saveEverywhere()

//test
saveEverywhere(injecting: TestClass.self)

关于通过将类作为函数参数传递来调用类方法的 Swift 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49603504/

相关文章:

iOS Swift 如何打开位置权限弹出窗口

python - MyClass.attr VS type(self).attr VS 单独的@classmethod

c++ - 如何从 boost 属性树中读取字段类型

python - 预期的 LP_c_double 实例而不是 c_double_Array - python ctypes 错误

表示性别或性别的 Ruby 约定

ios - 以编程方式在蜂窝和 WiFi 之间切换?

ios - 从 CGPoints 数组创建 CGContext

C++链式继承

Ruby/rspec 无法识别与前一个模块同名的 Ruby 类

swift :"Unrecognized selector sent to instance",Xcode 9.4.1