Передача различного регистра в качестве параметра функции в Swift - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть два простых перечисления, подобных этому:

    enum Bar:String {
        case obj1 = "Object1"
    }

    enum Foo:String {
        case obj2 = "Object2"
    }

Я хочу написать функцию, которая принимает перечисление в качестве параметра, и оно должно печатать значение необработанного регистра. Примерно так:

printCase(Bar.obj1) // prints "Object1"
printCase(Foo.obj2) // prints "Object2"

Я пытался, как this , но он принимает все перечисление как param. Но мой случай отличается от этого. Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Связанный вопрос на самом деле довольно близок - вам просто нужно изменить тип параметра на T вместо T.Type:

func printCase<T : RawRepresentable>(_ e: T) where T.RawValue == String {
    print(e.rawValue)
}

Поскольку вы принимаете экземпляр перечисления, не сам тип перечисления.

Конечно, вам не нужно ограничивать это перечислениями where T.RawValue == String, так как print может напечатать Any вещь.

1 голос
/ 14 апреля 2020

Вам просто нужно определить обобщенную функцию c, которая принимает RawRepresentable и возвращает свое свойство rawValue.

func rawValue<T: RawRepresentable>(of case: T) -> T.RawValue {
    `case`.rawValue
}

rawValue(of: Foo.obj2) // "Object2"
rawValue(of: Bar.obj1) // "Object1"
...