Переключение оператора, чтобы зациклить все случаи в Swift - PullRequest
0 голосов
/ 14 июня 2019

В Swift у меня есть enum и оператор switch, как показано ниже:

enum Job {
    case all
    case sweep
    case clean
    case wash
}

let job: Job = .all

switch job {
case .all:
    print("should do all the jobs below")
case .sweep:
    print("sweep")
case .clean:
    print("clean")
case .wash:
    print("wash")
}

Мой вопрос заключается в том, как я могу изменить оператор switch так, чтобы он зацикливал все случаи, если заданный job равен .all. Таким образом, результат печати .all должен быть:

sweep
clean
wash

У меня возникла идея:

switch job {
case .all: fallthrough
case .sweep:
    print("sweep")
    if job == .all { fallthrough }
case .clean:
    print("clean")
    if job == .all { fallthrough }
case .wash:
    print("wash")
}

и задаюсь вопросом, есть ли еще какое-нибудь «красивое» решение. Спасибо.

1 Ответ

1 голос
/ 14 июня 2019

Вы можете использовать CaseIterable для своего перечисления, а в случае .all просто выполнить итерацию по всем случаям (кроме .all), например так:


enum Job: CaseIterable {
    case all, sweep, clean, wash
}

func sweep() {
    print("sweep")
}

func clean() {
    print("clean")
}

func wash() {
    print("wash")
}

let job: Job = .all

func doJob(job: Job) {
    switch job {
        case .all:
            Job.allCases.forEach({
                switch $0 {
                    case .all:
                        break
                    default:
                        doJob(job: $0)
                }
            })
        case .sweep:
            sweep()
        case .clean:
            clean()
        case .wash:
            wash()
    }
}

doJob(job: job)
...