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

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.您可以使用typealiasin来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)