我有一个协议
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"
}
}
}