我有自己的数组类型,如何将此数组保存到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)")
}
答案 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对象数组转换为字典数组,反之亦然。