Swift-如何从类型中删除泛型?

Swift-如何从类型中删除泛型?,swift,generics,protocols,type-erasure,Swift,Generics,Protocols,Type Erasure,我需要声明如下数组: var cups: [DrinkGeneric] = [Cup<Water>(drink: Water.init()), Cup<Tea>(drink: Tea.init())] var cups:[Cup]=[] Cup是一个结构,Drink是一个协议,但我得到了以下错误: 协议类型“Drink”的值不能与“Drink”一致;只有结构/枚举/类类型才能符合协议 我知道协议类型'Drink'可以被AnyDrinkstruct擦除,流式代码就是一个

我需要声明如下数组:

var cups: [DrinkGeneric] = [Cup<Water>(drink: Water.init()), Cup<Tea>(drink: Tea.init())]
var cups:[Cup]=[]
Cup
是一个结构,
Drink
是一个协议,但我得到了以下错误:

协议类型“Drink”的值不能与“Drink”一致;只有结构/枚举/类类型才能符合协议

我知道协议类型'Drink'可以被
AnyDrink
struct擦除,流式代码就是一个例子

但事实上,当
中使用
关联类型
自我
和静态方法(在非最终类采用
饮料
的情况下,例如协议
equalable
和静态方法
=
)时,类型擦除将变得极其复杂

我的问题是:有没有更好的方法来声明
cups
数组?

或者:有没有简单的方法来进行类型擦除?它应该是一个内置功能。

协议饮料{
...
}
结构任意饮料:饮料{
让我们喝:喝
...
}
结构水:饮用{
...
}
struct咖啡:饮料{
...
}
结构茶:饮料{
...
}
结构杯{
私人(套装)var饮料:T?
变异函数自底向上(){
饮料=零
}
}
结构服务员{
变量杯:[杯]=[]
变异func makeacupofth(ucup:cup){
杯子。附加(杯子)
}
变异函数请注册meacupofshtodrink()->Cup{
return cups.removeFirst()
}
静态func借口(u客户:客户)->服务员{
回程服务员()
}
}
结构客户{
var me:Self{Self}
func饮料(){
服务员,服务员,对不起
var cup=服务员。请开始喝
杯底
}
}

对于问题:
有没有更好的方法来声明cups数组

您可以像这样使用另一个名为DrinkGeneric的协议,并通过Cup结构实现它:

protocol DrinkGeneric {
    func smaple()
    func typOfDrink() -> Drink.Type
}

struct Cup<T: Drink>: DrinkGeneric {
    public var drink: T?
    mutating func bottomUp() {
        drink = nil
    }
    
    public func typOfDrink() -> Drink.Type {
        return type(of: drink!)
    }
    
    func smaple() {
        print("sample")
    }
    
}

我认为没有一种符合
equalable
AnyDrink
是没有意义的。你能展示一下你将如何实施它吗?类型擦除并不总是可能的。@Sweeper它在这里@Sweeper Sb。删除我说的答案,你应该把它的内容写进你的问题里。现在就在这里
if type(of: cups[0].typOfDrink()) == Water.self {
    // any work
}