定义多个类型别名
Defining multiple typealiasses
在 Swift 中试验泛型时,我遇到了这个问题,但找不到答案。
假设我有以下代码:
protocol Component {
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
此处,实现 Contains
的类型应该能够存储任何实现由其类型别名指定的 Component
协议的类型。如果我将代码扩展为以下内容,它会按预期工作。
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
struct Container: Contains {
typealias CompType = SomeComponent
var components: [SomeComponent]
}
var x = Container(components: [SomeComponent()]) // works perfectly!
var y = Container(components: [AnotherComponent()]) // fails as expected
最后一个问题:是否可以让 Container.components
同时接受 SomeComponent
和 AnotherComponent
,但拒绝其他实现 Component
协议的类型?换句话说,typealias
可以容纳多于一种类型吗?
谢谢!
你可以遵守多个协议
typealias CompType = SomeComponent & AnotherComponent
或者你可以改变逻辑
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
var components: [Component] { get set }
}
struct Container: Contains {
var components: [Component]
}
var x = Container(components: [SomeComponent()])
var y = Container(components: [AnotherComponent()])
类型别名用于解析泛型关联类型。它必须明确地将其解析为一种类型;这就是分辨率。
好吧,按照您设置的方式,该类型可以而且必须是任何组件采用者。这就是这一行的意思:
associatedtype CompType: Component
您使用了组件的通用约束。如果那不是你想要的,你不应该那样设置。正如其他人所建议的那样,如果您只想让 SomeComponent 和 AnotherComponent 满足通用约束,那么您需要使用只有 SomeComponent 和 AnotherComponent 采用的协议。
我认为你根本不需要 associatedtype
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
var components: [Component] { get set }
}
struct Container: Contains {
var components: [Component]
}
var x = Container(components: [SomeComponent()])
var y = Container(components: [AnotherComponent()])
当您需要指定类型时,在协议上使用 associatedtype
。
在这种情况下,您不想指定,因为您希望能够接受协议的符合者
在 Swift 中试验泛型时,我遇到了这个问题,但找不到答案。
假设我有以下代码:
protocol Component {
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
此处,实现 Contains
的类型应该能够存储任何实现由其类型别名指定的 Component
协议的类型。如果我将代码扩展为以下内容,它会按预期工作。
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
struct Container: Contains {
typealias CompType = SomeComponent
var components: [SomeComponent]
}
var x = Container(components: [SomeComponent()]) // works perfectly!
var y = Container(components: [AnotherComponent()]) // fails as expected
最后一个问题:是否可以让 Container.components
同时接受 SomeComponent
和 AnotherComponent
,但拒绝其他实现 Component
协议的类型?换句话说,typealias
可以容纳多于一种类型吗?
谢谢!
你可以遵守多个协议
typealias CompType = SomeComponent & AnotherComponent
或者你可以改变逻辑
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
var components: [Component] { get set }
}
struct Container: Contains {
var components: [Component]
}
var x = Container(components: [SomeComponent()])
var y = Container(components: [AnotherComponent()])
类型别名用于解析泛型关联类型。它必须明确地将其解析为一种类型;这就是分辨率。
好吧,按照您设置的方式,该类型可以而且必须是任何组件采用者。这就是这一行的意思:
associatedtype CompType: Component
您使用了组件的通用约束。如果那不是你想要的,你不应该那样设置。正如其他人所建议的那样,如果您只想让 SomeComponent 和 AnotherComponent 满足通用约束,那么您需要使用只有 SomeComponent 和 AnotherComponent 采用的协议。
我认为你根本不需要 associatedtype
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
var components: [Component] { get set }
}
struct Container: Contains {
var components: [Component]
}
var x = Container(components: [SomeComponent()])
var y = Container(components: [AnotherComponent()])
当您需要指定类型时,在协议上使用 associatedtype
。
在这种情况下,您不想指定,因为您希望能够接受协议的符合者