Swift 文件存储

一、UserDefaults存储配置信息

主要存储APP相关的配置信息、用户信息等。

示例如下:

// 存储
let user: String = "123456789"
UserDefaults.standard.set(user, forKey: "user")
// 读取
let userName: String = UserDefaults.standard.object(forKey: "user") as! String
print(userName)

UserDefaults是一个全局的单例,一般在需要存储账户信息,配置信息,这些比较简单的信息的时候,可以用它来存储。最基本的存储就是利用String的Key值去存储数据。
它实际上是一个存储在沙盒的.plist文件,只不过iOS6.0之后就没有存在常用的目录下,所以,不对系统进行破解是看不到这个文件的。
Userdefaults可以存储诸如:Data, String, NSNumber, Array, Dictionary等(这些数据类型是鄙人自己根据代码推测的,如有不对,请斧正)。
Swift是一个强类型的语言,在存储和读取的时候,切记对于类型的把握,否则容易导致代码出问题。

二、文件存储

主要存储非机密数据,比较大的数据等,如图片

示例:(存储Data数据,注意Data数据的路径的获取)

// 此代码位于do catch代码块里
let userAccountPath =  NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first!
let encoder = JSONEncoder()
if let BeerData = try? encoder.encode(myStruct) {
        print(BeerData)
        let url = URL.init(fileURLWithPath: userAccountPath).appendingPathComponent("userData.data")
        try BeerData.write(to: url)
}

Swift4.0提供了一个类似于NSCoding的协议: Codable协议,该协议可以让开发者很方便的对Struct、class、enum进行归档、解档。

根据个人对于相关资料的查阅,Codable协议没有NSCoding协议类似的NSKeyedArchive类来进行持久化的存储。该协议的decode\encode方式,仅仅将我们的对象方便的处理为Json数据(.plist文件我没有尝试)。所以在进行持久化存储的时候,对于对象或者说是我们归档好的Json数据,我们可以根据个人需求进行存储。可以利用UserDefaults, 也可以利用上面的例子里的Data.write(to: )方法去存储。

String的存储:

        let stringPath: String = NSHomeDirectory() + "/Documents/TookieString.txt"
        let string: String = "存储进去的String"
        // 路径遵循 StringProtocol协议
        try? string.write(toFile: stringPath, atomically: true, encoding: .utf8)
        print("存储的路径",stringPath)

Image的存储(类似于Data的存储)
Array的存储:

        let arr: Array = ["123", "321","234"]
        let arrPath = NSHomeDirectory() + "/Documents/arr.plist"
        let array = NSArray.init(array: arr)
        array.write(toFile: arrPath, atomically: true)

Dictnory存储类似于array的存储。

三、Codable序列化

关于这部分内容,我仅仅查阅的一些比较浅显的资料,并未去官方文档进行深入的研究,有相关升入研究的同志,还请不吝赐教

示例:

struct Swifter: Codable {
    let fullName: String
    let id: Int
    let twitter: URL
}

// 二进制化的json数据
let json = """
{"fullName": "Federico Zanetello","id": 123456,"twitter": "http://twitter.com/zntfdr"}
""".data(using: .utf8)!
// 解档 json -> 对象
let myStruct = try JSONDecoder().decode(Swifter.self, from: json) // Decoding our data
print(myStruct) // 解档的结果

// 归档 对象 -> json数据
let userAccountPath =  NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first!
let encoder = JSONEncoder()
if let BeerData = try? encoder.encode(myStruct) {
        print(BeerData) // 完成了对数据的二进制化归档
        let url = URL.init(fileURLWithPath: userAccountPath).appendingPathComponent("userData.data")
        try BeerData.write(to: url)
}

上述代码完成了从data到对象,对象到data的相互转化,对于Codable协议的解档和归档,均以data数据(主要在于将data持久化存储,转化为其他的数据,加密等)为核心处理。

补充:
在某些情况下,我们会将josn数据以Data的类型存储在沙盒路径下,示例代码如下:

let url = URL.init(fileURLWithPath: userAccountPath).appendingPathComponent("userData.data")
let data = try FileHandle.init(forReadingFrom: url)
let myStruct2 = try JSONDecoder().decode(Swifter.self, from: data.readDataToEndOfFile())
print(myStruct2)

这里读取文件数据用到了FileHandle这个类,该类和FileManager一起,作为iOS开发中对于文件操作的管理类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,948评论 19 139
  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 2,979评论 2 10
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,721评论 30 472
  • 一、iOS应用数据存储的常用方式: 1> XML属性列表(plist)归档2> Preference(偏好设置)3...
    DB001阅读 1,712评论 0 5
  • 八点钟坐上火车,四个小时后,凌晨12:00到了济南,赶上了返程的高潮,火车上很拥挤,好不容易挤下车之后,检票走出了...
    朱六子阅读 313评论 0 3

友情链接更多精彩内容