微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我需要像这样声明一个数组:

var cups: [Cup<Drink>] = []

Cup一个结构体,Drink一个协议,但我收到以下错误

协议类型'Drink'的值不能符合'Drink';只有 struct/enum/class 类型才能符合协议

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

但实际上,当associatetypeSelf和静态方法(在非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 举报,一经查实,本站将立刻删除。