在其他语言中,为许多设计模式定义接口容器是很常见的。据我了解,在 Swift 中,接口是作为协议实现的。但是,我正在努力使这个简单的代码片段发挥作用:
protocol Item: AnyObject {
}
class Container<Value> where Value: AnyObject {
}
let test = Container<Item>()
编译器抱怨:
“容器”要求“任何项目”是类类型
经过一些研究,通常建议使用
Item
协议的特定实现作为 Container
的类型参数,例如
class ConcreteItem: Item {
}
let test = Container<ConcreteItem>()
但是,这阻碍了拥有不同类型容器的想法:可能还有另一个类
ConcreteItem2
,其实现与ConcreteItem
的实现完全无关,但符合相同的接口。
那么在 Swift 中实现这项工作的简洁方法是什么?
这里不能使用泛型,因为它必须是具体类型。让协议成为一个属性
class Container {
var value: any Item
init(value: any Item) {
self.value = value
}
}