快速协议关联类型

时间:2020-04-14 09:26:47

标签: swift protocols

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

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?
}

没关系。

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

像这样:

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

有可能吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

let instance = ServiceModule<TestA>()

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

  • 使用通用约束
  • 使用some关键字(仅用于函数和计算属性)返回不透明的类型,对实现进行出价。