88
99import Foundation
1010
11- private let CurrentLevelKey = " CurrentLevel "
12- private let LastMeasurementDate = " LastMeasurementDate "
13- private let LastUpdateDate = " LastUpdateDate "
11+ private let savedPointsKey = " SavedPoints "
12+ private let lastUpdateDateKey = " LastUpdateDate "
13+
14+ private let pointsCount = 8
15+
16+ struct DataPoint {
17+ let date : Date
18+ let value : Double
19+ }
1420
1521class DataStore {
1622 let defaults = UserDefaults . standard
@@ -19,28 +25,51 @@ class DataStore {
1925
2026 var currentLevel : Double ? {
2127 get {
22- return defaults . object ( forKey : CurrentLevelKey ) as? Double
28+ return points . last ? . value
2329 }
24- set {
25- defaults. set ( newValue, forKey: CurrentLevelKey)
30+ }
31+
32+ var lastMeasurementDate : Date ? {
33+ get {
34+ return points. last? . date
2635 }
2736 }
2837
2938 var lastUpdateDate : Date ? {
3039 get {
31- return defaults. object ( forKey: LastUpdateDate ) as? Date
40+ return defaults. object ( forKey: lastUpdateDateKey ) as? Date
3241 }
3342 set {
34- defaults. set ( newValue, forKey: LastUpdateDate )
43+ defaults. set ( newValue, forKey: lastUpdateDateKey )
3544 }
3645 }
3746
38- var lastMeasurementDate : Date ? {
47+ var points : [ DataPoint ] {
3948 get {
40- return defaults. object ( forKey: LastMeasurementDate) as? Date
41- }
42- set {
43- defaults. set ( newValue, forKey: LastMeasurementDate)
49+ guard let tuples = defaults. object ( forKey: savedPointsKey) as? [ [ Any ] ] else {
50+ return [ ]
51+ }
52+
53+ return tuples. compactMap { t in
54+ if t. count == 2 , let date = t [ 0 ] as? Date , let value = t [ 1 ] as? Double {
55+ return DataPoint ( date: date, value: value)
56+ } else {
57+ return nil
58+ }
59+ }
4460 }
4561 }
62+
63+ func addPoints( _ newPoints: [ DataPoint ] ) {
64+ var pointMap : [ Date : DataPoint ] = [ : ]
65+
66+ self . points. forEach { p in pointMap [ p. date] = p }
67+ newPoints. forEach { p in pointMap [ p. date] = p }
68+
69+ let allPoints = pointMap. keys. sorted ( ) . map { date in pointMap [ date] ! }
70+ let recentPoints = Array ( allPoints. suffix ( pointsCount) )
71+ let encodedData = recentPoints. map { p in [ p. date, p. value ] }
72+
73+ defaults. set ( encodedData, forKey: savedPointsKey)
74+ }
4675}
0 commit comments