swift 如何确定子协议中的关联类型

swift how to determine associatedtype in sub protocol

我有一个关于协议关联类型的问题。

这是代码..

protocol TestProtocol {
    associatedtype T: Equatable
}

struct Test {
    let value: TestProtocol
}

有错误。

struct Test<T: TestProtocol> {
    let value: T
}

没关系。但我不想在结构中使用泛型。

所以我试过了..

protocol IntTestProtocol: TestProtocol where T == Int  {

}

struct Test {
    let value: IntTestProtocol
}

但是,这段代码也有错误。

如何确定子协议中TestProtocol的关联类型? 可能吗?

怎么样

protocol TestProtocol {
    associatedtype T: Equatable
}

struct TestProtocolContainer<U: Equatable>: TestProtocol {
    typealias T = U
}


struct Test {
    let value: TestProtocolContainer<Int>
}

当您使用 associatedtype 声明协议时(它提供静态多态性,如果您有兴趣了解各种类型的多态性以及如何使用 swift 中的协议实现它,请阅读我的 blogpost 这里)。

您不能将该协议用作具体类型,因为编译器无法在编译期间解析 T 的类型。 (为什么在编译的时候,我说它的静态多态性记得:))

这就是为什么编译器希望您以某种方式提供它以帮助它在编译期间解析 associatedtype 的类型。一种方法是提供 typealias 并指定 associatedtype.

的实际数据类型

示例:

struct TestProtocolContainer: TestProtocol {
    typealias T = Int
}

这很好用,但是您可能希望使这个通用结构代表具有 Equatable 类型的任何结构。这就是泛型的用武之地。

struct TestProtocolContainer<U: Equatable>: TestProtocol {

这表示使用任何 Equatable 类型并确认 TestProtocol 最后设置

的通用结构
typealias T = U

确保确认TestProtocol

希望对您有所帮助