Skip to content

Instantly share code, notes, and snippets.

@Kalzem
Created November 6, 2018 17:41
Show Gist options
  • Save Kalzem/2efda8bcef7a4286b5dc62770ea5aab5 to your computer and use it in GitHub Desktop.
Save Kalzem/2efda8bcef7a4286b5dc62770ea5aab5 to your computer and use it in GitHub Desktop.
OrderedDictionary for Swift 4.2
import Foundation
struct OrderedDictionary<Key: Hashable, Value> {
var keys = [Key]()
var values = [Key: Value]()
var count: Int {
return self.keys.count
}
subscript(index: Int) -> Value? {
get {
let key = self.keys[index]
return self.values[key]
}
set(newValue) {
let key = self.keys[index]
if newValue != nil {
self.values[key] = newValue
} else {
self.values.removeValue(forKey: key)
self.keys.remove(at: index)
}
}
}
subscript(key: Key) -> Value? {
get {
return self.values[key]
}
set(newValue) {
if let newVal = newValue {
let oldValue = self.values.updateValue(newVal, forKey: key)
if oldValue == nil {
self.keys.append(key)
}
} else {
self.values.removeValue(forKey: key)
self.keys = self.keys.filter {$0 != key}
}
}
}
}
extension OrderedDictionary: Sequence {
func makeIterator() -> AnyIterator<Value> {
var counter = 0
return AnyIterator {
guard counter<self.keys.count else {
return nil
}
let next = self.values[self.keys[counter]]
counter += 1
return next
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment