【问题标题】:Default implementation of protocol for Enum枚举协议的默认实现
【发布时间】:2015-12-03 10:11:02
【问题描述】:

这是我的代码:

protocol Logable {
    func log()
}

extension Logable where Self: Error {
    func log() {
        switch self {
        case .Server(code: Int, message: String):
            print("code = \(code), message = \(message)")
        }
    }
}

enum Error: Logable {
    case Client(code: Int, message: String)
    case Server(code: Int, message: String)
}

如您所见,我想为我的枚举 Error 创建协议 LogableError 的默认实现。也许不可能 - 请提供链接。不要在操场上运行它,它不会显示任何内容,但编译器会给出错误: type 'Self' constrained to non-protocol type 'Error'

【问题讨论】:

  • 在协议扩展中尝试Self == Error
  • @Roshan 它给了Same-type requirement makes generic parameter 'Self' non-generic
  • 是的,有点预感它不会工作...如果您需要为特定类型实现协议,您将在类型本身而不是协议上添加扩展...
  • 请注意,“默认实现”对于枚举没有多大意义,因为无论如何您都不能从它们继承。我怀疑如果您将枚举替换为严格的(例如,Int),上述解决方案可能会起作用......

标签: swift enums swift2 protocols


【解决方案1】:

如果您想为Error 实现Logable,则不需要协议扩展,只需在Error 上进行扩展即可。

protocol Logable {
    func logError()
}

enum Error {
    case Client(code: Int, message: String)
    case Server(code: Int, message: String)
}

extension Error : Logable {
    func logError() {
        switch self {
            case .Client(let code, let message):
                print("code = \(code), message = \(message)")

            case .Server(let code, let message):
                print("code = \(code), message = \(message)")
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-09
    • 2016-04-26
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多