我想写一个通用方法,它可以访问多个枚举的情况以及它们的公共变量。
enum MyEnum:String,CaseIterable {
case a = "a"
var ourVar:MyAnotherEnum {
switch self {
case .a:
return MyAnotherEnum.a1
}
}
}
enum MyAnotherEnum:String,CaseIterable {
case a1 = "a1"
}
enum YourEnum:String,CaseIterable {
case b = "b"
var ourVar:YourAnotherEnum {
switch self {
case .b:
return YourAnotherEnum.b1
}
}
}
enum YourAnotherEnum:String,CaseIterable {
case b1 = "b1"
}
我的和你的枚举都有 "ourVar "作为公共变量。现在,我想写一个方法,如果我传递一个枚举,它可以打印所有的值。类似这样的方法。
printAll(MyEnum.self) //Should print "a" and "a1"
我试着对一个枚举进行迭代,比如:
func printAll<T>(_ id:T.Type) where T:RawRepresentable, T:CaseIterable {
for c in T.allCases {
print(c.rawValue) //Prints the value correctly
print(c.ourVar) //Throws error "Value of type 'T' has no member 'ourVar'"
}
}
我的期望是: printAll(myEnum)
应该打印 "a "和 "a1"。
我的代码流程很复杂,无法解释,但我肯定需要这个方法来节省上千行。谁能帮帮我?
首先,你需要创建一个 CommonEnum
protocol
与 ourVar
作为其中一项要求,如:
protocol CommonEnum {
associatedtype T
var ourVar: T { get }
}
现在符合上述 protocol
到 MyEnum
和 YourEnum
,
enum MyEnum: String, CaseIterable, CommonEnum {
//....
}
enum YourEnum: String,CaseIterable, CommonEnum {
//....
}
下一步, printAll(_:)
方法将
func printAll<T>(_ id: T.Type) where T: CommonEnum & RawRepresentable & CaseIterable {
for c in T.allCases {
print(c.rawValue)
print(c.ourVar)
}
}
例如:
printAll(MyEnum.self) //prints a and a1