【发布时间】:2015-08-29 21:53:46
【问题描述】:
我有一个 ViewController,它使用我无法控制的框架中的一个类(称为 A)。 A 提供了我需要的类函数(称之为f)。我想让A 在测试中易于模拟。
所以我的想法是创建一个与A具有相同签名的协议P,扩展A以实现P,然后创建一个模拟类M,它也实现P并有一个虚拟实现的f。然后在我的测试中,我可以只做viewController.dependency = M,一切都应该是花花公子。
说起来容易做起来难,原因我希望你能帮助我理解。
在我的 viewController 中,很容易声明一个包含符合协议的实例的变量,然后将该变量重新分配给另一个符合协议的实例:
// works
var dependency: P = A()
dependency.f()
dependency = M()
dependency.f()
但是只用类型做同样的事情是行不通的:
// doesn't work
var dependency = A.self
dependency = M.self // cannot assign value of M.Type to a value of type A.Type
// also doesn't work
var dependency: P = A.self // type A.Type does not conform to protocol P
有没有办法让它工作?我想也许我可以为dependency 使用泛型类型,但我无法弄清楚为变量赋值声明泛型类型的语法。
【问题讨论】:
-
为什么
dependency = M()不足以满足您的需求? -
我宁愿避免实例化类,因为我只在它上面使用类方法。此外,Swift 不允许您在实例上调用类方法,因此
dependency = M(); dependency.f()不会编译。我可以做dependency = M(); dependency.dynamicType.f(),但那闻起来很糟糕......而且我必须用dependency.dynamicType.f()替换我的VC 代码中每个现有的dependency.f()调用。
标签: swift generics types polymorphism