【问题标题】:How to store arrays of tuples in swift如何快速存储元组数组
【发布时间】:2016-04-24 02:11:07
【问题描述】:

我正在制作一个应用程序,我必须存储四个数组(类型为 [(Double, Double)] 和三重 og 类型(String、String、String)的数据。它们在以下类中声明

class DataStorer {
    static var losArray = [(Double, Double)]()
    static var morgenArray = [(Double, Double)]()
    static var middagArray = [(Double, Double)]()
    static var aftenArray = [(Double, Double)]()
    static var lastMeal = ("", "", "")
}

我需要在应用关闭(或发生其他事情,如通话)时归档它们,并在应用需要时检索数据。数组的最大长度为 18。我该怎么做?

【问题讨论】:

  • 用只有 2 个元素的子数组创建一个二维数组
  • 您可以使用NSUserDefaults 来存储和检索这样的数据。或者像stackoverflow.com/questions/7172001/…这样的JSON格式,或者使用NSCoding等。

标签: arrays xcode swift storage archive


【解决方案1】:

如果你没有在你的数组中使用太多的值,你可以将它们存储到 NSUserDefaults 中。对于结构化数据,我倾向于为子值创建字典,以使属性列表美观且便于用户阅读。

将元组数组保存为默认值非常简单:

let encodedValues = losArray.map{return ["0":$0.0, "1":$0.1]}
NSUserDefaults.standardUserDefaults().setObject(encodedValues, forKey:"losArray")

加载有点复杂,但这只是为了说明属性列表中数据可能损坏的所有方式:

func loadValuesFromDefaults(arrayName:String) -> [(Double, Double)] {
    guard let encodedArray = NSUserDefaults.standardUserDefaults().arrayForKey(arrayName) else {return []}
    return encodedArray.map{$0 as? NSDictionary}.flatMap{
        guard let values = $0 else {return nil}
        if let xValue = values["0"] as? Double,
               yValue = values["1"] as? Double {
                return (xValue, yValue)
        } else {
            return nil
        }
    }
}

如果您愿意,可以将“0”和“1”标签替换为适合元组的标签。这将保存并加载一个字典数组,元组的值以人类可读的格式存储在数组中。这使得深入研究属性列表以及在开发期间或之后读取和调整值变得容易。

加载函数中的各种条件可防止您出现缺少数组、具有错误类型的同名数组以及该数组中单独损坏的项目。我已经看到了从属性列表数组中反序列化原始对象数据的令人讨厌的崩溃和安全问题,所以我用它来防止它们。

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多