Chr*_*ris 12 generics enums protocols class swift
使用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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
这无法使用消息"枚举案例模式无法匹配每个案例行中非枚举类型'Greeting'的值来编译.这似乎是因为订阅者协议期望一些不比Message更专业的东西,但我根据Greeting设置,虽然它实现了Message,但它更专业.(我对吗?)
那么,我该怎么做我想做的事,拜托?
pNr*_*Nre 11
泛型类型参数T
在执行中仍应是通用的Subscriber
.您可以使用typealias
in来protocol Subscriber
执行您所要求的操作并对其强制执行Message
超类约束:
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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
拥有通用会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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6853 次 |
最近记录: |