繁体   English   中英

如何快速存储元组数组

[英]How to store arrays of tuples in swift

我正在制作一个应用程序,我必须存储四个数组([[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。我该怎么做?

如果您在数组中使用的值过多,则可以将其存储到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”标签。 这将保存并加载一个字典数组,其中元组的值以人类可读的格式存储在该数组中。 这使得在开发过程中或之后轻松挖掘属性列表以及读取和调整值。

加载函数中的各种条件可保护您避免丢失数组,使用错误类型的相同名称的数组以及该数组中的各个损坏的项。 通过属性列表数组反序列化原始对象数据,我已经看到了令人讨厌的崩溃和安全问题,因此我使用它来防止它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM