我有一个 ViewController,它使用一个不受我控制的框架中的类(称之为 A
)。 A
提供了一个我需要的类函数(称之为f
)。我想让 A
易于在测试中进行模拟。
所以我的想法是创建一个与A
具有相同签名的协议(protocol)P
,扩展A来实现P,然后创建一个模拟类M
也实现了 P
并且有一个 f
的虚拟实现。然后在我的测试中,我可以只做 viewController.dependency = M
一切都应该很漂亮。
这说起来容易做起来难,原因我希望你能帮助我理解。
在我的 viewController 中,很容易声明一个包含符合协议(protocol)的实例的变量,然后将该变量重新分配给另一个符合协议(protocol)的实例:
// 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
使用泛型,但我想不出一种语法来为变量赋值声明泛型。
最佳答案
如果你真的想存储类型本身,你可以使用P.Type
。以下适用于 Swift 2:
protocol P {
static func foo()
}
class A: P {
static func foo() { print("A foo") }
}
class M: P {
static func foo() { print("M foo") }
}
var dependency: P.Type = A.self
dependency = M.self
dependency.foo()
关于swift - 在 Swift 中,类型(不是实例)可以符合协议(protocol)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291028/