关注迅速公众平台
关注微信联系人
企业电话:021-64391578
商务联系:18717819904 林经理
Swift - 使用UserDefaults来进行本地数据存储
在 iOS 开发中,UserDefaults 是一个非常方便的工具,适合存储轻量级的本地客户端数据。例如,您可以用它来实现记住密码的功能,保存系统的用户名和密码。下次登录时,您可以直接从 UserDefaults 中读取上次登录的信息。
虽然我们还可以使用 SQLite 数据库或自定义的 plist 文件来存储本地数据,但这些方法需要手动创建和读取文件,操作相对繁琐。而 UserDefaults 则简化了这一过程,您可以像读取字符串一样直接读取存储的数据。
UserDefaults 支持多种数据格式,包括:
不建议使用 UserDefaults 存储大文件数据。虽然理论上可以存储多个 GB 的数据(取决于设备剩余空间),但 UserDefaults 设计并非用于处理大数据。当应用启动时,系统会自动加载 UserDefaults 中的所有数据,过大的数据会导致启动缓慢,从而影响性能。因此,对于大文件,建议使用 Core Data、CloudKit、SQLite 等结构化存储方式。
下面的示例演示了如何使用 UserDefaults:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("用户 UUID:\(getUUID())")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
func getUUID() -> String {
let userId = UserDefaults.standard.string(forKey: "webxun")
// 判断 UserDefaults 中是否已经存在
if let id = userId {
return id
} else {
// 不存在则生成一个新的并保存
let uuidRef = CFUUIDCreate(nil)
let uuidStringRef = CFUUIDCreateString(nil, uuidRef)
let uuid = uuidStringRef as String
UserDefaults.standard.set(uuid, forKey: "webxun")
return uuid
}
}
以下是存储和读取原生数据类型的示例:
let userDefault = UserDefaults.standard
// 存储字符串
userDefault.set("webxun.com", forKey: "Object")
let objectValue: Any? = userDefault.object(forKey: "Object")
// 存储整型
userDefault.set(12345, forKey: "Int")
let intValue = userDefault.integer(forKey: "Int")
// 存储浮点型
userDefault.set(3.2, forKey: "Float")
let floatValue = userDefault.float(forKey: "Float")
// 存储双精度浮点型
userDefault.set(5.2240, forKey: "Double")
let doubleValue = userDefault.double(forKey: "Double")
// 存储布尔值
userDefault.set(true, forKey: "Bool")
let boolValue = userDefault.bool(forKey: "Bool")
// 存储 URL
userDefault.set(URL(string: "https://example.com")!, forKey: "URL")
let urlValue = userDefault.url(forKey: "URL")
// 存储字符串
userDefault.set("webxun.com", forKey: "String")
let stringValue = userDefault.string(forKey: "String")
// 存储 NSNumber
var number = NSNumber(value: 22)
userDefault.set(number, forKey: "NSNumber")
number = userDefault.object(forKey: "NSNumber") as! NSNumber
// 存储数组
var array: [String] = ["123", "456"]
userDefault.set(array, forKey: "Array")
array = userDefault.array(forKey: "Array") as! [String]
// 存储字典
var dictionary = ["1": "webxun.com"]
userDefault.set(dictionary, forKey: "Dictionary")
dictionary = userDefault.dictionary(forKey: "Dictionary") as! [String: String]
对于系统对象的存储,需要通过 NSKeyedArchiver 将其转换为 Data 类型,以下是以 UILabel 对象为例的示例:
let label = UILabel()
label.text = "欢迎访问 webxun.com"
let labelData = NSKeyedArchiver.archivedData(withRootObject: label)
userDefault.set(labelData, forKey: "labelData")
if let objData = userDefault.data(forKey: "labelData") {
let myLabel = NSKeyedUnarchiver.unarchiveObject(with: objData) as? UILabel
print(myLabel)
}
如果想要存储自定义类的实例,首先需要让该类实现 NSCoding 协议。以下是一个示例:
class UserInfo: NSObject, NSCoding {
var name: String
var phone: String
required init(name: String = "", phone: String = "") {
self.name = name
self.phone = phone
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObject(forKey: "Name") as? String ?? ""
self.phone = decoder.decodeObject(forKey: "Phone") as? String ?? ""
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "Name")
coder.encode(phone, forKey: "Phone")
}
}
// 存储自定义对象
let model = UserInfo(name: "迅速", phone: "1234")
let modelData = NSKeyedArchiver.archivedData(withRootObject: model)
userDefault.set(modelData, forKey: "myModel")
// 读取自定义对象
if let myModelData = userDefault.data(forKey: "myModel") {
let myModel = NSKeyedUnarchiver.unarchiveObject(with: myModelData) as! UserInfo
print(myModel)
}
要删除已保存的数据,可以使用 removeObject(forKey:) 方法。例如:
UserDefaults.standard.removeObject(forKey: "webxun")
特别申明:本站的主旨在于收集互联网运营相关的干货知识,给运营小伙伴提供便利。 网站所收集到的公开内容均来自于互联网或用户投稿,并不代表本站认同其观点, 也不对网站内容的真实性负责,如有侵权,请联系站长删除
业务联系