迅速公众平台-上海小程序开发专家迅速网络

关注迅速公众平台

迅速公众平台-上海小程序开发专家迅速网络

关注微信联系人

企业电话:021-64391578


商务联系:18717819904 林经理

Swift - 使用UserDefaults来进行本地数据存储


在 iOS 开发中,UserDefaults 是一个非常方便的工具,适合存储轻量级的本地客户端数据。例如,您可以用它来实现记住密码的功能,保存系统的用户名和密码。下次登录时,您可以直接从 UserDefaults 中读取上次登录的信息。

虽然我们还可以使用 SQLite 数据库或自定义的 plist 文件来存储本地数据,但这些方法需要手动创建和读取文件,操作相对繁琐。而 UserDefaults 则简化了这一过程,您可以像读取字符串一样直接读取存储的数据。

支持的数据格式

UserDefaults 支持多种数据格式,包括:

  • Int
  • Float
  • Double
  • Bool
  • Array
  • Dictionary
  • 甚至 Any 类型

注意事项

不建议使用 UserDefaults 存储大文件数据。虽然理论上可以存储多个 GB 的数据(取决于设备剩余空间),但 UserDefaults 设计并非用于处理大数据。当应用启动时,系统会自动加载 UserDefaults 中的所有数据,过大的数据会导致启动缓慢,从而影响性能。因此,对于大文件,建议使用 Core Data、CloudKit、SQLite 等结构化存储方式。

示例:UserDefaults 的用法

下面的示例演示了如何使用 UserDefaults:

  1. 如果是第一次运行程序,通过 CFUUIDCreate 方法生成一个唯一字符串作为用户 ID(例如:B8DDB58D-73BF-4E39-A051-365858FC4626)。
  2. 之后的运行中,直接从 UserDefaults 中获取用户 ID。
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")

 


相关推荐
AR扫福咯!
互联网金融,如何在移动端布局?
今日元宵节 你知道为何要吃汤圆吗?古人咋庆祝?
SEO小技巧:2020年的正确优化方式是什么?
网站地图怎么生成?

特别申明:本站的主旨在于收集互联网运营相关的干货知识,给运营小伙伴提供便利。 网站所收集到的公开内容均来自于互联网或用户投稿,并不代表本站认同其观点, 也不对网站内容的真实性负责,如有侵权,请联系站长删除

业务联系

迅速服务号
扫码添加微信好友
我们来联系您