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 不透明类型对实现进行投标。
我有一个关于 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 不透明类型对实现进行投标。