可以将枚举类型名称作为参数传递给Swift吗?

时间:2016-08-05 16:05:28

标签: swift types enums

我试图弄清楚是否可以传递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的签名是什么?

2 个答案:

答案 0 :(得分:10)

您可以利用具有原始值的枚举自动符合RawRepresentable协议的事实。您可以定义一个泛型函数,该函数采用给定类型T的元类型参数(拼写为T.Type),其中TRawRepresentable,在您的情况下,其RawValueInt

这将允许您分别传递FooBar的拼字游戏,拼写为Foo.selfBar.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()

然后你不必担心传递任何东西。当然,它不仅仅适用于枚举