Можно ли передать имя типа enum в качестве аргумента в Swift?

Я пытаюсь выяснить, можно ли передать тип enum так же, как вы можете передатьClass объекты в Swift.

Мой фактический вариант использования немного сложнее, но для обсуждения, скажем, у меня есть два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)

Решение Вопроса

что перечисления с необработанными значениями автоматически соответствуют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"
 Silvan Mosberger05 авг. 2016 г., 18:40
Хорошая ссылка на SO документы +1
 yuf27 мар. 2018 г., 21:14
Как мне написать это в Swift 4, где метод также возвращает значение? С "where T.RawValue == Int -> String" он думает, что RawValue является (Int) -> String. РЕДАКТИРОВАТЬ: Тип возвращаемого значения метода приходит ДО предложения where!

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()

Тогда вам не нужно беспокоиться о передаче чего-либо. И, конечно, это будет работать не только для перечислений

 PeejWeej05 авг. 2016 г., 21:23
Если это ThingA: Int и ThingB: Int, все будет хорошо. Вы также можете написать расширение для любого другого типа RawValue
 Kevin06 авг. 2016 г., 20:44
Это не решает проблему, хотя. Я хочу позвонитьsomeOtherMethod(Thing)неThing.testPrint()
 Kevin05 авг. 2016 г., 19:54
Это не помогает, потому что у меня нетThing, Я пытаюсь пройтиThingA или жеThingB в качестве аргумента,

Ваш ответ на вопрос