Petter Braka
Petter Braka

Reputation: 349

Save array of Days in Swift 5

So i have created a class for a Day and for a Drink. and I'm trying to track how much you drink in a day, but I'm struggling with saving multiple days. I'm currently managing to save the current day(with the amount drunk that day) but i don't know how to save more than one day.

I want to save an array of type Day with all the days. how can i do this?

This is my Day class:

public class Day: NSObject {
var date: Date
var goalAmount: Drink
var consumedAmount: Drink

func saveDay() {
    let formatting = DateFormatter()
    formatting.dateFormat = "EEEE - dd/mm/yy"
    UserDefaults.standard.set(formatting.string(from: date), forKey: "date")
    UserDefaults.standard.set(goalAmount.amountOfDrink, forKey: "goal")
    UserDefaults.standard.set(consumedAmount.amountOfDrink, forKey: "consumed")
}

func loadDay() {
    let rawDate = UserDefaults.standard.value(forKey: "date") as? String ?? ""
    let formatter = DateFormatter()
    formatter.dateFormat = "EEEE - dd/mm/yy"
    date = formatter.date(from: rawDate)!
    goalAmount.amountOfDrink = UserDefaults.standard.float(forKey: "goal")
    consumedAmount.amountOfDrink = UserDefaults.standard.float(forKey: "consumed")
}
}

This is my Drink class:

class Drink: NSObject {
   var typeOfDrink: String
   var amountOfDrink: Float

}

i am calling saveDay() when there are any changes made to the day, and then loadDay() when the app opens.

Upvotes: 0

Views: 300

Answers (2)

Sajal Gupta
Sajal Gupta

Reputation: 149

A better approach would be is to store the object of the class in userDefaults instead of storing particular properties of that class. And use [Date] instead of Date to save multiple days

For this first, you have Serialize the object to store in userDefaults and Deserialize to fetch the data from userDefaults.

import Foundation

class Day: Codable {

    var date = Date()
    var goalAmount: Drink
    var consumedAmount: Drink

    init(date: Date, goalAmount: Drink,consumedAmount: Drink ) {
        self.date = date
        self.goalAmount = goalAmount
        self.consumedAmount = consumedAmount

    }


  static func saveDay(_ day : [Day]) {
        do {
            let object = try JSONEncoder().encode(day)
            UserDefaults.standard.set(object, forKey: "days")
        } catch {
            print(error)
        }


    }

  static func loadDay() {
        let decoder = JSONDecoder()
        if  let object = UserDefaults.standard.value(forKey: "days") as? Data {
            do {
                let days = try decoder.decode([Day].self, from: object)

                for day in days {
                    print("Date - ", day.date)
                    print("Goal Amount - ", day.goalAmount)
                    print("Consumed Amount - ",day.consumedAmount)
                    print("----------------------------------------------")
                }


            } catch {
                print(error)
            }


        } else {
            print("unable to fetch the data from day key in user defaults")
        }
    }
}


class Drink: Codable {
    var typeOfDrink: String
    var amountOfDrink: Float

    init(typeOfDrink: String,amountOfDrink: Float ) {
        self.typeOfDrink = typeOfDrink
        self.amountOfDrink = amountOfDrink
    }

}

Use saveAndGet() method to store and fetch details from userDefaults

func saveAndGet() {
 // use any formats to format the dates
        let date = Date()
        let goalAmount = Drink(typeOfDrink: "Water", amountOfDrink: 5.0)
        let consumedAmount = Drink(typeOfDrink: "Water", amountOfDrink: 3.0)

        let day1 = Day(date: date, goalAmount: goalAmount, consumedAmount: consumedAmount)
        let day2 = Day(date: date, goalAmount: goalAmount, consumedAmount: consumedAmount)
        let day3 = Day(date: date, goalAmount: goalAmount, consumedAmount: consumedAmount)
        let day4 = Day(date: date, goalAmount: goalAmount, consumedAmount: consumedAmount)

        let days = [day1, day2, day3, day4]
        Day.saveDay(days)

        Day.loadDay()
    }

Upvotes: 2

Anil Kumar
Anil Kumar

Reputation: 1984

1) You need to create array of object for this :

goalAmount = [Drink]()
var date = [Date]()

and append with each new element. you can also add date variable inside your drink class.

2) you can also create array of dictionary:

var userData = [String : Any]()

key will be you date and Any contain related to drink data in Any you can store Anything.

Upvotes: 0

Related Questions