Проверьте, можно ли создать перечисление из параметра в переключателе

На основании ответов я написал для себя это:

import datetime;
print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]

Выход:

['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']

Разница в том, что я получаю объект 'date', а не 'datetime.datetime'.

2
задан Fogmeister 18 January 2019 в 15:55
поделиться

2 ответа

Не делайте это слишком сложным. Включите значение base и обработайте parameter, где это необходимо, с помощью if или guard и необязательного связывания:

init?(base: String, parameter: String?) {
    switch base {
    case "a":
        guard let p = parameter, let foo = Foo(rawValue: p) else { return nil }
        self = .a(foo)
    case "b":
        self = .b
    case "c":
        guard let p = parameter, let bar = Bar(rawValue: p) else { return nil }
        self = .c(bar)
    default:
        return nil
    }
}

Легко понять, без принудительного развертывания и [115 ] или Bar значения создаются только один раз (при необходимости).

Это также сводит к минимуму тесты: в качестве примера, MyEnum(base: "a", parameter: nil) может перейти к случаю "a" и вернуться nil. В вашем операторе switch он не соответствует случаю ("a", let p?), а затем все еще проверяет остальные случаи.

0
ответ дан Martin R 18 January 2019 в 15:55
поделиться

Другой альтернативой является switch для инициализаторов Foo и Bar:

init?(base: String, parameter: String?) {
    switch (base, parameter.flatMap { Foo.init(rawValue: [110]) ?? Bar(rawValue: [110]) } as Any?) {
    case ("a", let foo as Foo):
        self = .a(foo)
    case ("b", _):
        self = .b
    case ("c", let bar as Bar):
        self = .c(bar)
    default:
        return nil
    }
}

Недостатком является то, что если Foo и Bar имеют общие случаи, то вы можете не получить результат, который вы хотите. Кроме того, если число случаев увеличится, то также может появиться выражение на switch.

0
ответ дан Cristik 18 January 2019 в 15:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: