【发布时间】:2021-03-02 07:21:47
【问题描述】:
我需要像这样声明一个数组:
var cups: [Cup<Drink>] = []
Cup 是一个结构,Drink 是一个协议,但我收到以下错误:
协议类型“Drink”的值不能符合“Drink”;只有结构/枚举/类类型可以符合协议
我知道协议类型 'Drink' 可以通过 AnyDrink 结构擦除,流式代码就是一个示例。
但实际上associatetype、Self和static-method(非final类的情况下采用Drink,比如协议Equatable带有static方法==) 用于Drink。
我的问题是:有没有更好的方法来声明cups 数组?
或者:有什么简单的方法可以进行类型擦除吗?它应该是一个内置功能。
protocol Drink {
...
}
struct AnyDrink: Drink {
let drink: Drink
...
}
struct Water: Drink {
...
}
struct Coffee: Drink {
...
}
struct Tea: Drink {
...
}
struct Cup<T: Drink> {
private(set) var drink: T?
mutating func bottomUp() {
drink = nil
}
}
struct Waiter {
var cups: [Cup<AnyDrink>] = []
mutating func makeACupOfSth(_ cup: Cup<AnyDrink>) {
cups.append(cup)
}
mutating func pleaseGiveMeACupOfSthToDrink() -> Cup<AnyDrink> {
return cups.removeFirst()
}
static func excuse(_ customer: Customer) -> Waiter {
return Waiter()
}
}
struct Customer {
var me: Self { self }
func drink() {
var waiter = Waiter.excuse(me)
var cup = waiter.pleaseGiveMeACupOfSthToDrink()
cup.bottomUp()
}
}
【问题讨论】:
-
我认为拥有符合
Equatable的AnyDrink是没有意义的。你能展示你将如何实现它吗?类型擦除并非总是可行的。 -
@Sweeper 在这里stackoverflow.com/a/66435614/456536
-
@Sweeper Sb.删掉答案???,你还需要吗?
-
我说,你应该把edit的内容放到你的问题中。
标签: swift generics protocols type-erasure