使用Swift编写一个协议,要求实现该协议的类必须具有一个函数,该函数接受一个符合给定协议的枚举(其中该枚举类型是泛型指定的)。我尝试过以下代码:
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协议期望接收不比Message更特殊的内容,但我使用了Greeting进行设置,虽然Greeting实现了Message,但它更加特殊。(我的理解是否正确?)
那么,请问我应该如何实现我的目标呢?
FooType
和Foo
的事物类型(即,Dictionary
现在具有Key
和Value
而不是KeyType
和ValueType
,而Sequence
现在是SequenceType
)。他们并不完全一致,但在这种情况下,你答案中的Message
和MessageType
似乎是反过来的。 - Nate CookMessageType
,以便使用 Chris 在他的问题中使用的相同类名。 - pNreSomeObject
时,你不能分配一个Message
类型,而是必须绑定到Greeting
。你想让SomeObject
的每个实例在receive
中使用不同的类型吗?在这种情况下,你将无法切换到message
,因为Hello
和Goodbye
是Greeting
字段。 - pNre