当枚举实现协议时,匹配开关中的枚举值



我有一个协议

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"
}

,但我真的不想!

我缺少语法或技术吗?

您需要与类型E匹配,然后才能测试值 E.a,但这可以在单个表达式中完成:

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

您可以在情况下使用特定类型的enum定义P扩展

创建像这样的扩展名

extension P where Self == E {
    var value:String {
        switch self  {
        case .a  :
                return "A"
        case .b:
            return "b"
        }
    }
}
let e = E.a.value
print(e)

输出:

" a"

您正在错误地使用它:如果扩展了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"
        }
    }
}

最新更新