На основании ответов я написал для себя это:
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
'.
Не делайте это слишком сложным. Включите значение 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?)
, а затем все еще проверяет остальные случаи.
Другой альтернативой является 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
.