【问题标题】:STRUCT Array To UserDefaults结构数组到用户默认值
【发布时间】:2017-03-14 04:26:02
【问题描述】:

我有一个自定义的 Struct 类来保存卡路里、脂肪、碳水化合物和蛋白质。

每次用户输入数据时,我都会将其放入变量中

 var theArray : NSMutableArray = []

struct CFCPstruct {
    let calories : Int!
    let fats : Int!
    let carbs : Int!
    let protein: Int!
    init(Calories: Int, Fats: Int, Carbs: Int, Protein: Int) {
        self.calories = Calories
        self.fats = Fats
        self.carbs = Carbs
        self.protein = Protein
    }
}

 let addLog = [CFCPstruct(Calories: totalCalories, Fats: totalFats, Carbs: totalCarbs, Protein: totalProtein)]

现在我还创建了一个数组来存储所有内容。然后我需要将所有值存储到数组中,然后将其存储到 UserDefaults。

然后我将需要调用用户默认调用数组 [0] 让我们说,然后调用每个卡路里、碳水化合物……类似于 thelog.calories //theology.carbs 等

【问题讨论】:

    标签: swift struct nsarray nsuserdefaults


    【解决方案1】:

    为了能够使用NSCoding,对象必须是一个类。但由于所有值都符合属性列表,您可以添加变量 dictionaryRepresentation 和相应的初始化程序。

    首先从不在 Swift 中使用NSMutableArray,并且从不将变量声明为隐式展开的可选变量,这些变量使用非可选初始化程序进行初始化。

    var theArray = [CFCPstruct]()
    
    struct CFCPstruct  {
        let calories : Int
        let fats : Int
        let carbs : Int
        let protein: Int
    
        init(calories: Int, fats: Int, carbs: Int, protein: Int) {
            self.calories = calories
            self.fats = fats
            self.carbs = carbs
            self.protein = protein
        }
    
        init(dictionary : [String:Int]) {
            self.calories = dictionary["calories"]!
            self.fats = dictionary["fats"]!
            self.carbs = dictionary["carbs"]!
            self.protein = dictionary["protein"]!
        }
    
        var dictionaryRepresentation : [String:Int] {
            return ["calories" : calories, "fats" : fats, "carbs" : carbs, "protein" : protein]
        }
    }
    

    现在您可以读取和写入用户默认值的数组。

    func saveDefaults() 
    {
        let cfcpArray = theArray.map{ $0.dictionaryRepresentation }
        UserDefaults.standard.set(cfcpArray, forKey: "cfcpArray")
    }
    
    func loadDefaults()
    {
        theArray = (UserDefaults.standard.object(forKey: "cfcpArray") as! [[String:Int]]).map{ CFCPstruct(dictionary:$0) }
    }
    

    【讨论】:

      【解决方案2】:

      现在,如果您已经创建了一个数据数组,您可以将其保存如下:-

      让 yourArrayOfDict = [["a": "Smith", "b": "UK"], ["a": "Paul", "b": "阿联酋"]]

      斯威夫特 3:

      let defaults = UserDefaults.standard
      defaults.set(yourArrayOfDict, forKey: "customKey_SavedArray")
      

      现在,您可以通过以下方式访问它们

      let s = defaults.value(forKey: "customKey_SavedArray")
      print(s)
      

      你会在s中得到你的值,所以你可以print(s)来确保数组被保存。

      斯威夫特 2:

      let defaults = NSUserDefaults.standardUserDefaults()
      defaults.setValue(yourArrayOfDict, forKey: "customKey_SavedArray")
      

      访问它们

      let s = defaults.objectForKey("customKey_SavedArray") as? [[String:AnyObject]]
      

      现在,这里的 s 将值保存为数据数组,因此您可以使用如您所说的那样访问它们, let first_item = s[0], 或者,您可以使用 for in 循环遍历数组中的项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-24
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2012-06-22
        • 1970-01-01
        • 2010-10-19
        相关资源
        最近更新 更多