[英]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
的具体类型,将在编译时解析。 调用者(类 init)将定义关联的类型。 这里P
的类型是TestA
。
let instance = ServiceModule<TestA>()
要理解的最重要的是,您不能将具有关联类型的协议用作具体类型。 您只能:
some
关键字(仅适用于函数和计算属性)返回一个不透明的类型来竞标实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.