如何将数组保存到ios文件目录?

时间:2016-11-22 02:13:02

标签: ios arrays json swift

我有自己的数组类型,如何将此数组保存到ios文档目录。这是我的代码

struct Patient {
        var lastName: String?
        var firstName: String?
    }
var offpatients = [Patient]()
let patient = Patient(lastName: lastName as String?, firstName: firstName as String?)
offpatients.append(patient)

for p in offpatients {
    print("offline patients \(p)")
}

3 个答案:

答案 0 :(得分:2)

我们无法直接将struct对象保存到NSArray,我们甚至无法使用任何结构数组来保存在文档目录中。所以我们需要一些转换。

首先确定文档目录中存储的路径。在此函数中,我们将传递要存储在文档目录中的数组文件的名称

func getFilePath(fileName:String) -> String {
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    let filePath = url.appendingPathComponent(fileName)?.path
    return filePath!
}

主要流程从这里开始。现在我们将在此函数中传递Patient结构数组,该数组将转换为NSMutableArray并保存在DocumentDirectory中。

func convertAndSaveInDDPath (array:[Patient]) {
    let objCArray = NSMutableArray()
    for obj in array {

        // we have to do something like this as we can't store struct objects directly in NSMutableArray
        let dict = NSDictionary(objects: [obj.firstName ?? "",obj.lastName ?? ""], forKeys: ["firstName" as NSCopying,"lastName" as NSCopying])
        objCArray.add(dict)
    }

    // this line will save the array in document directory path.
    objCArray.write(toFile: getFilePath(fileName: "patientsArray"), atomically: true)
}

因此,请将此方法用于保存过程。

convertAndSaveInDDPath(array: offpatients)

要查看物理文件,只需打印getFilePath(fileName: "patientsArray")的结果即可。它会根据您的系统设置打印出类似的内容。

/Users/rajan/Library/Developer/CoreSimulator/Devices/B8BD5017-4BD0-47F7-B840-BE9464817392/data/Containers/Data/Application/D09FFC21-D215-44C3-831B-95A470C41A47/Documents/patientsArray

导航到生成的路径,您会在文档目录位置找到 patientArray 文件。

现在为了以相同的形式(swift array的{​​{1}})取回它

struct

只需调用此函数,您就可以将保存的数组放回到结构形式的快速数组中。

func getArray() -> [Patient]? {
    var patientsArray = [Patient]()
    if let _ = FileManager.default.contents(atPath: getFilePath(fileName: "patientsArray")) {
        let array = NSArray(contentsOfFile: getFilePath(fileName: "patientsArray"))
        for (_,patientObj) in array!.enumerated() {
            let patientDict = patientObj as! NSDictionary
            let patient = Patient(lastName: patientDict.value(forKey: "lastName") as? String, firstName: patientDict.value(forKey: "firstName") as? String)
            patientsArray.append(patient)

        }
        return patientsArray
    }
    return nil
}

你已经完成了。

希望这有帮助!

答案 1 :(得分:0)

这对你有用。

使用SwiftyJSON框架。 NSFileHande将是你应该从哪里读取和写入文件

let array = ["A", "B", "C"]
let json = JSON(array)
let storage = json.description
let data = storage.dataUsingEncoding(NSUTF8StringEncoding)!
if let file = NSFileHandle(forWritingAtPath:path) {
    file.writeData(data)
} 

答案 2 :(得分:0)

您无法将自定义对象直接保存到文件中。您需要将自己限制为JSON支持的类型,或者#34;属性列表对象"。

假设您将每个Patient对象转换为[String: String]类型的字典。

一旦有[String: String]个词典,您可以使用NSJSONSerialization将其保存到JSON文件,或使用Array方法write(to:atomically:)保存它作为一个plist。

编辑:

这样的事情可以将Patient对象转换为字典:

func patientToDict(patient: Patient) -> [String: [String: String]] {
    return ["Patient": ["lastName": patient.lastName, 
      "firstName": patient.firstName]]
}

然后您需要一个相应的patientFromDict函数,它接受一个Dictionary对象并返回一个Patient对象

您可以编写一个map语句,将整个Patient对象数组转换为字典数组,反之亦然。