我有一个协议
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"
}
但我真的不想要!
我缺少一种语法或技巧吗?
答案 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"
}
}
}