如何将数组保存到ios文档目录?
Posted
技术标签:
【中文标题】如何将数组保存到ios文档目录?【英文标题】:how to save array to ios document directory? 【发布时间】:2016-11-22 02:13:01 【问题描述】:我有自己的数组类型,如何将这个数组保存到 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)")
【问题讨论】:
你不是第一个在这里问这个问题的人。同一个问题已经被问了几十次了。 此任务的哪一部分您需要帮助?到目前为止,您尝试了什么? 我在数组中有患者的信息 json 文件并将该数组保存到文档目录,然后我从该目录中读取它 @NeoTeo 试试我发布的答案。 【参考方案1】:我们不能直接将结构对象保存到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
of 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
只需调用此函数,您将保存的数组以相同的 swift 结构体数组返回。
let patientRetrievedArray = getArray()
你就完成了。
希望这会有所帮助!
【讨论】:
【参考方案2】:这对你有用。
使用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)
【讨论】:
这将如何工作?问题是关于一组自定义结构。 字典可以添加到数组中,可以序列化后写入文档目录 什么词典?没有字典。 让患者 = Patient(lastName: lastName as String?, firstName: firstName as String?) 或 [string: String] 字典 @gurmandeep 我猜这不是您在答案中处理的简单数组。它是一个 struct 的自定义对象数组,纯粹是 swift。【参考方案3】:您不能将自定义对象直接保存到文件中。您需要将自己限制为 JSON 支持的类型或“属性列表对象”。
假设您将每个 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 对象数组转换为字典数组,反之亦然。
【讨论】:
如何将我的 offpatients 数组转换为 [String: String] json?let convert = offpatients as [String: String]
这是对的吗?以上是关于如何将数组保存到ios文档目录?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 视频文件数组可以很好地保存到应用程序库,但不能正确保存到应用程序文档目录