当枚举实现协议时,在switch中匹配枚举值

时间:2018-02-08 12:10:46

标签: swift switch-statement

我有一个协议

protocol P { }

它由枚举实现

enum E: P {
    case a
    case b
}

到目前为止,非常好。

我希望能够接收P的实例,如果它是E之一,则返回特定值(将来会有其他枚举/结构等实现P )。

我试过这个:

extension P {

    var value: String {
        switch self {
            case E.a: return "This is an E.a"
            default: return "meh"
        }
    }
}

但这并没有编译

error: Temp.playground:14:16: error: enum case 'a' is not a member of type 'Self'
    case E.a: return "hello"

我也尝试过:

 case is E.a: return "This is an E.a"

只是给出了这个错误:

 error: Temp.playground:14:19: error: enum element 'a' is not a member type of 'E'
     case is E.a: return "hello"
             ~ ^

我知道我可以这样做:

switch self {
    case let e as E:
        switch e {
            case E.a: return "hello"
            default: return "meh"
        }
    default: return "meh"
}

但我真的不想要!

我缺少一种语法或技巧吗?

3 个答案:

答案 0 :(得分:8)

您需要匹配类型E才能对其进行测试 值E.a,但这可以在一个表达式中完成:

extension P {    
    var value: String? {
        switch self {
        case let e as E where e == .a:
            return "hello"
        default:
            return nil
        }
    }
}

答案 1 :(得分:1)

您可以在案例

中定义具有特定类型P的{​​{1}}扩展程序

像这样创建扩展

enum

输出:

  

“A”

答案 2 :(得分:0)

您使用错误:如果您延长P,则只能访问P的成员,而不能访问E的成员。

我不建议使用强制转换扩展P并在其中添加所有E内容,而是像这样扩展E

protocol P { 
    var value:String { get }
}

// Default implementation
extension P  {
    var value: String { return ""  }
}

enum E: P {
    case a
    case b
}

extension E {

    var value: String {
        switch self {
            case .a: return "This is an E.a"
            default: return "meh"
        }
    }
}
相关问题