gpt4 book ai didi

class - 如何编写枚举类型的 Swift 泛型函数?

转载 作者:IT王子 更新时间:2023-10-29 05:27:09 25 4
gpt4 key购买 nike

我想使用 Swift 编写一个协议(protocol),该协议(protocol)指定实现类必须具有一个采用枚举(遵守给定协议(protocol))的函数,其中该枚举类型是通用指定的。我试过这个:

protocol Message {}

protocol Subscriber {
func receive<T where T:Message>(message:T)
}

enum Greeting : Message {
case Hello, Goodbye
}

class SomeObject : Subscriber {
func receive<Greeting>(message: Greeting) {
switch message {
case .Hello:
println("Hello")
case .Goodbye:
println("Goodbye")
}
}
}

编译失败,每个 case 行都显示消息“Enum case pattern cannot match values of the non-enum type 'Greeting'”。这似乎是因为 Subscriber 协议(protocol)期望的东西并不比 Message 更专业,但我根据 Greeting 进行了设置,尽管它实现了 Message,但它更专业。 (我说得对吗?)

那么,请问我该怎么做呢?

最佳答案

泛型类型参数 TSubscriber 的实现中应该仍然是泛型的。您可以使用 protocol Subscriber 中的 typealias 执行您要求的操作,并对其执行 Message 父类(super class)约束:

protocol Message {}

protocol Subscriber {
typealias MessageType: Message
func receive (message: MessageType)
}

enum Greeting : Message {
case Hello, Goodbye
}

class SomeObject : Subscriber {
typealias MessageType = Greeting

func receive (message: MessageType) {
switch message {
case .Hello:
println("Hello")
case .Goodbye:
println("Goodbye")
}
}
}

使用通用的receive 可以防止您打开enum 字段:

protocol Message {}

protocol Subscriber {
func receive <T: Message> (message: T)
}

enum Greeting : Message {
case Hello, Goodbye
}

class SomeObject : Subscriber {
func receive <T: Message> (message: T) {

}
}

let obj = SomeObject()
obj.receive(Greeting.Hello)

关于class - 如何编写枚举类型的 Swift 泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25311933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com