Предположим, у нас есть перечисление и мы хотим перечислить его :).
Если он имеет Int rawValue, мы можем получить следующий и предыдущий элементы, используя вычисленные переменные, подобные этому.
enum Fidelity: Int, CaseIterable {
case pixel
case point
case average
case datapoint
var previousFidelity: Fidelity {
return Fidelity(rawValue: rawValue - 1) ?? .pixel
}
var nextFidelity: Fidelity {
return Fidelity(rawValue: rawValue + 1) ?? .datapoint
}
}
Я пошел дальше и создал и расширение для CaseIterable, которое позволяет next () и previous () для широкого диапазона типов.
// Let's test Swift 4.2 for enumerating enum
// Too complex, not very efficient, but interesting
extension CaseIterable where Self: Equatable {
func next() -> Self? {
let all = Self.allCases
let idx = all.index(of: self)!
let next = all.index(after: idx)
return (next == all.endIndex) ? nil : all[next]
}
func previous() -> Self? {
let all_reversed = Self.allCases.reversed()
let idx = all_reversed.index(of: self)!
let next = all_reversed.index(after: idx)
return (next == all_reversed.endIndex) ? nil : all_reversed[next]
}
}
Вопрос в том, насколько эффективны или неэффективны мои решения (т.е. скорость, память)?
Есть ли какие-либо идеи для того, чтобы сделать те же или похожие вещи, возможно, offset(by: )
.