swift - 在 Swift 中,类型(不是实例)可以符合协议(protocol)吗?

标签 swift generics types polymorphism

我有一个 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/

相关文章:

swift - ContentView 背景色 Swift

ios - 如何在 iPhone 上用 Swift 实现 UDP 客户端和发送数据?

swift - AVPlayer : Unable to stream-play . mp4 & .mpg 文件

swift - 检查字符串是否为 nil 和空

ios - 泛型类的扩展

c# - 从静态方法获取派生类型

java - 列表包含类型不安全的方法

generics - Rust:通用参数是否可以具有引用其他参数的范围?

c - C 中的指针何时计算出它引用的内存量?

c++ - 嵌入数据的多种类型