如何解决Swift - 如何从类型中删除泛型?
我需要像这样声明一个数组:
var cups: [Cup<Drink>] = []
Cup
是一个结构体,Drink
是一个协议,但我收到以下错误:
协议类型'Drink'的值不能符合'Drink';只有 struct/enum/class 类型才能符合协议
我知道协议类型 'Drink' 可以被 AnyDrink
结构擦除,流动代码就是一个例子。
但实际上,当associatetype
、Self
和静态方法(在非final类采用Drink
的情况下,例如协议 Equatable
和静态方法 ==
) 用于 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()
}
}
解决方法
问题:Is there any better way to declare the cups array
您可以像这样使用另一个名为 DrinkGeneric 的协议并通过 Cup Struct 实现它:
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")
}
}
然后像这样创建一个类型为 DrinkGeneric 的数组:
var cups: [DrinkGeneric] = [Cup<Water>(drink: Water.init()),Cup<Tea>(drink: Tea.init())]
对于支票类型:
if type(of: cups[0].typOfDrink()) == Water.self {
// any work
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。