swift 协议关联类型

swift protocol associatedtype

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

protocol SomeProtocol {}

protocol TestAProtocol: SomeProtocol {}

protocol TestBProtocol: SomeProtocol {}

class TestA: TestAProtocol {}

class TestB: TestBProtocol {}

protocol Service {
    associatedtype S: SomeProtocol

    var service: S? { get }
}

class ServiceModule: Service {
    var service: TestAProtocol?
}

此代码有错误,因为 ServiceModule 中的服务类型是协议 (TestAProtocol)(不是具体类型)。

class ServiceModule: Service {
    var service: TestA?
}

class ServiceModule: Service {
    var service: TestB?
}

没关系。

但我想要一个符合特定协议(例如 SomeProtocol)的协议(例如 TestAProtocol)的变量。

像这样:

class ServiceModule: Service {
        var service: TestAProtocol? // or var service: TestBProtocol?
    }

可能吗?

这不起作用,因为您没有在 ServiceModule 中指定关联类型 class 并且 Swift 编译器无法推断基础类型。您应该使用您的协议作为通用约束:

class ServiceModule<P: TestAProtocol>: Service {
    var service: P?
}

这里P是符合TestAProtocol的具体类型,会在编译时解析。调用者(class init)将定义关联类型。这里 P 将是 TestA 类型。

let instance = ServiceModule<TestA>()

最重要的是要理解,您不能将具有关联类型的协议用作具体类型。您只能:

  • 将其用作通用约束
  • 使用 some 关键字(仅用于函数和计算属性)return 不透明类型对实现进行投标。