【问题标题】:Save array of Days in Swift 5在 Swift 5 中保存天数
【发布时间】:2020-07-25 02:48:25
【问题描述】:

所以我为一天和一杯饮料创建了一个课程。我正在尝试追踪你一天喝了多少酒,但我正在努力保存好几天。我目前正在设法保存当天(当天喝了多少酒),但我不知道如何保存超过一天。

我想保存一个包含所有天数的 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")
}
}

这是我的饮料课:

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

}

我在当天有任何更改时调用 saveDay(),然后在应用程序打开时调用 loadDay()。

【问题讨论】:

    标签: ios arrays swift5 saving-data


    【解决方案1】:

    更好的方法是将类的对象存储在 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()
        }
    

    【讨论】:

    • 当我尝试实现这一点时,我得到:“Day”类型不符合“Decodable”协议,“Day”类型不符合“Encodable”协议。我不明白如何实现这些
    • 您是否在 Day 类中添加了任何其他自定义属性?如果是,那么每个类或结构都应该实现可编码协议。
    • 我清理构建后它工作了,但我应该如何使用它?我假设 saveAndGet() 函数应该在 viewController 中,然后在我想保存或获取日期时调用它。这不会在所有日期对饮料使用相同的值吗?
    • 我想保存一个 Day 类型的数组,而不仅仅是日期。
    • 我已经更新了我的解决方案来存储多个 Day,是的,saveAndGet() 函数应该在 viewController 中,当你想同时从 userDefaults 保存和获取数据时调用。如果您只想在 userDefaults 中保存数据,请使用 Day.saveDay(_ day: [Day]) 并使用 Day.loadData() 方法获取数据
    【解决方案2】:

    1) 您需要为此创建对象数组:

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

    并附加每个新元素。 您还可以在您的饮料类中添加日期变量。

    2) 你也可以创建字典数组:

    var userData = [String : Any]()
    

    关键是你的日期和任何包含与饮料数据相关的任何你可以存储的任何东西。

    【讨论】:

    • 我不知道我会如何实现它。
    • 您能解释一下如何添加该实现吗?
    • 创建一个类似下面的类 class Drink: NSObject { var typeOfDrink: String var amountOfDrink: Float var date = [Date] () init(date: [Date], typeOfDrink: String,amountOfDrink: Float ) { self.date = date self.typeOfDrink = typeOfDrink self.amountOfDrink = amountOfDrink } 在 Day 类中使​​用你想要的类对象}
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2021-02-07
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多