我有一个关于快速协议关联类型的问题。
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?
}
有可能吗?
答案 0 :(得分:3)
这不起作用,因为您未在ServiceModule类中指定关联的类型,并且Swift编译器无法推断基础类型。您应该改为使用协议作为一般约束:
class ServiceModule<P: TestAProtocol>: Service {
var service: P?
}
这里P
是符合TestAProtocol
的具体类型,将在编译时解析。调用者(类init)将定义关联的类型。这里P
的类型为TestA
。
let instance = ServiceModule<TestA>()
最重要的理解是,您不能将具有关联类型的协议用作具体类型。您只能:
some
关键字(仅用于函数和计算属性)返回不透明的类型,对实现进行出价。