Protocolをenumだけに準拠させてrawValueを使えるようにすることはできますか。
MyProtocol
を、enum
のみに準拠させられるようにして、enum
のrawValue
を使えるようにすることは可能ですか。
以下のようにMyProtocol
でenum
のrawValue
を使えるようにしたいです。
protocol MyProtocol {
}
enum MyEnum1: String, MyProtocol {
case a = "AAA1"
case b = "BBB1"
}
enum MyEnum2: String, MyProtocol {
case a = "AAA2"
case b = "BBB2"
}
enum MyEnum3: String, MyProtocol {
case a = "AAA3"
case b = "BBB3"
}
class MyClass {
func methodA(foo: MyProtocol) {
print(foo.rawValue) // これが出来るようにしたい
}
func methodB() {
methodA(foo: MyEnum1.a) // "AAA1"
methodA(foo: MyEnum2.a) // "AAA2"
methodA(foo: MyEnum3.a) // "AAA3"
}
}
MyProtocol
で独自にrawVal
を定義することで一応やりたいことはできましたが、全てのenum
でrawVal
を書く手間が発生するため、できればrawValue
をそのまま使いたいです。
protocol MyProtocol {
var rawVal: String { get }
}
enum MyEnum1: String, MyProtocol {
var rawVal: String { return self.rawValue }
case a = "AAA1"
case b = "BBB1"
}
class MyClass {
func methodA(foo: MyProtocol) {
print(foo.rawVal) // これならできる
}
}
考えをまとめるとenum
にスーパークラスみたいなものを作りたいということなのですが、そもそもProtocol
の使い方が間違っていますでしょうか……?