我试图弄清楚是否可以传递enum的类型,就像你可以在Swift中传递Class
个对象一样。
我的实际用例比这更复杂,但是为了讨论,假设我有两个Int
枚举:
enum Foo: Int, CustomStringConvertible {
case firstFoo = 0
case anotherFoo = 1
var description: String {
switch self {
case .firstFoo:
return "Hello Foo"
case .anotherFoo:
return "Goodbye Foo"
}
}
}
enum Bar: Int, CustomStringConvertible {
case firstBar = 0
case anotherBar = 1
var description: String {
switch self {
case . firstBar:
return "Hello Bar"
case . anotherBar:
return "Goodbye Bar"
}
}
}
我希望能够写出这样的函数:
func justAnExample(whichEnum: enum) {
let val = whichEnum(rawValue: 0)
print("description: \(String(val))")
}
然后像这样使用它:
justAnExample(Foo)
// prints: "description: Hello Foo"
justAnExample(Bar)
// prints: "description: Hello Bar"
这可能吗?如果是这样,函数声明中whichEnum
的签名是什么?
答案 0 :(得分:10)
您可以利用具有原始值的枚举自动符合RawRepresentable
协议的事实。您可以定义一个泛型函数,该函数采用给定类型T
的元类型参数(拼写为T.Type
),其中T
为RawRepresentable
,在您的情况下,其RawValue
为Int
。
这将允许您分别传递Foo
和Bar
的拼字游戏,拼写为Foo.self
和Bar.self
:
func justAnExample<T : RawRepresentable>(_ enumType: T.Type) where T.RawValue == Int {
// Note that an explicit use of init is required when creating an instance from a
// metatype. We're also using a guard, as `init?(rawValue:)` is failable.
guard let val = enumType.init(rawValue: 0) else { return }
print("description: \(val)")
}
justAnExample(Foo.self) // prints: "description: Hello Foo"
justAnExample(Bar.self) // prints: "description: Hello Bar"
答案 1 :(得分:-1)
一种解决方案是为RawRepresentable,E.G。
编写扩展名extension RawRepresentable where RawValue == Int{
static func testPrint() {
print(Self(rawValue: 0))
}
}
enum Thing: Int {
case Test = 0
}
// prints "Optional(Thing.Test)"
Thing.testPrint()
然后你不必担心传递任何东西。当然,它不仅仅适用于枚举