Немного повторяясь с ответом, который вы предоставили:
enum TimeFrame: Equatable {
case all
case countable(timeFrame: CountableTimeFrame)
case exact(date: Date)
}
enum CountableTimeFrame: Equatable {
case hour
case day
case week
case month
case year
indirect case multiple(CountableTimeFrame, Int)
var timeFrame: TimeFrame {
return .countable(timeFrame: self)
}
static func * (left: CountableTimeFrame, right: Int) -> CountableTimeFrame {
switch left {
case .multiple(let timeFrame, let count):
return .multiple(timeFrame, count * right)
default:
return .multiple(left, right)
}
}
static func * (left: Int, right: CountableTimeFrame) -> CountableTimeFrame {
return right * left
}
}
Запретит неправильное использование, например, disallow:
let timeFrame: TimeFrame = .multiple(.exact(date: someDate), 666)
let timeFrame: TimeFrame = .multiple(unspecified, 40)
let timeFrame: TimeFrame = .multiple(all, -1)
И разрешит умножение с помощью оператора *, например,
let timeFrame: CountableTimeFrame = 4 * .hour
print(timeFrame) // multiple(__lldb_expr_5.CountableTimeFrame.hour, 4)
print(timeFrame * 2) // multiple(__lldb_expr_5.CountableTimeFrame.hour, 8)
А. Не указано:
let optionalTimeFrame: TimeFrame? = nil