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

Я пытаюсь выяснить (если это возможно), как передать ассоциированное значение перечисления в функцию, а затем переключить тип для выполнения некоторого указанного c кода.

Это работает на игровой площадке:

struct Bar {}
struct Baz {}

enum Test {
    case foo
    case bar(value: Bar)
    case baz(value: Baz)
}

func doSomething(value: Test) {
    switch value {
        case .foo: print("foo")
        case .bar: print("bar")
        case .baz: print("baz")
    }
}

let bar = Bar()
doSomething(value: .bar(value: bar)) // prints "bar"
doSomething(value: .foo) // prints "foo"

Но возможно ли передать соответствующее значение непосредственно в качестве аргумента? Примерно так:

let bar = Bar()
doSomething(value: bar)

Это, конечно, не получается, потому что Bar не тот же тип, что и Test.

Как я могу это сделать?

РЕДАКТИРОВАТЬ

Для пояснения, в настоящее время я использую перегрузку, но хотел посмотреть, смогу ли я иметь один центральный Метод publi c, который затем отправляет приватным методам на основе типа соответствующего значения.

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Просто предоставьте перегруженную функцию

func doSomething(value: Bar) {
    print("bar")
}

doSomething(value: bar) // now works !!
1 голос
/ 01 мая 2020

Вы можете создать функцию, которая принимает параметр Any, а затем попытаться выяснить тип внутри, включив поддерживаемые типы, но я не уверен, что это будет лучше, чем иметь отдельные функции для каждого типа.

func doSomething(value: Any) {
    switch value {
    case is Test:
        switch value as? Test {
        case .foo:
            print("foo")
        default:
            print("Not foo")
        }
    case is Bar:
        print("bar")
    case is Baz:
        print("baz")
    default:
        print("Not supported")
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...