Сохранить массив дней в Swift 5 - PullRequest
0 голосов
/ 12 апреля 2020

Итак, я создал класс для Дня и Напитка. и я пытаюсь отследить, сколько ты выпиваешь за день, но я борюсь за сохранение нескольких дней. В настоящее время мне удается сохранить текущий день (с количеством выпитого в этот день), но я не знаю, как сохранить более одного дня.

Я хочу сохранить массив типа Day со всеми дней. как я могу это сделать?

Это мой дневной класс:

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")
}
}

Это мой класс Drink:

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

}

я вызываю saveDay (), когда там любые изменения, внесенные в день, а затем loadDay (), когда приложение открывается.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Лучшим подходом было бы сохранить объект класса в userDefaults вместо хранения определенных свойств этого класса. И используйте [Date] вместо Date для сохранения нескольких дней

Для этого сначала у вас есть Сериализация объект для хранения в userDefaults и Десериализация для извлечения данные из 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
    }

}

Используйте метод saveAndGet() для хранения и извлечения подробностей из 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()
    }
0 голосов
/ 12 апреля 2020

1) Для этого вам нужно создать массив объектов:

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

и добавить к каждому новому элементу. вы также можете добавить переменную даты в свой класс напитка.

2) вы также можете создать массив словаря:

var userData = [String : Any]()

ключ будет вашей датой и любой содержит связанные с данными о напитке в любом Вы можете хранить что угодно.

...