UserDefaults
用途:存储轻量级的用户配置或设置(如用户偏好、应用设置)。
特点:
基于键值对(Key-Value)存储。
适合存储少量数据(如布尔值、字符串、数字等)。
数据存储在 plist 文件中。
示例:
// 存储数据
UserDefaults.standard.set("value", forKey: "key")
// 读取数据
let value = UserDefaults.standard.string(forKey: "key")
文件系统
用途:存储文件或自定义数据(如图片、音频、文本文件等)。
特点:
可以使用 FileManager 类来管理文件和目录。
数据存储在应用的沙盒目录中(如 Documents、Library、Caches 等)。
示例:
let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("example.txt")
// 写入文件
let data = "Hello, World!".data(using: .utf8)
try? data?.write(to: fileURL)
// 读取文件
if let data = try? Data(contentsOf: fileURL) {
let text = String(data: data, encoding: .utf8)
print(text ?? "")
}
SQLite
用途:直接操作 SQLite 数据库。
特点:
轻量级的关系型数据库。
适合需要复杂查询和大量数据的场景。
需要使用 SQL 语句进行操作。
示例:
import SQLite3
var db: OpaquePointer?
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("database.sqlite")
// 打开数据库
if sqlite3_open(fileURL.path, &db) == SQLITE_OK {
let createTableQuery = "CREATE TABLE IF NOT EXISTS Users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"
sqlite3_exec(db, createTableQuery, nil, nil, nil)
}
Keychain
用途:存储敏感数据(如密码、令牌、加密密钥)。
特点:
数据加密存储,安全性高。
即使应用被删除,数据也不会丢失。
示例:
import Security
let service = "com.yourapp"
let account = "user"
let password = "secret".data(using: .utf8)!
// 存储数据
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecValueData as String: password
]
SecItemAdd(query as CFDictionary, nil)
// 读取数据
let searchQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
SecItemCopyMatching(searchQuery as CFDictionary, &item)
if let data = item as? Data {
let password = String(data: data, encoding: .utf8)
print(password ?? "")
}
Realm
用途:替代 Core Data 和 SQLite 的第三方数据库。
特点:
简单易用,性能优异。
支持对象存储和实时更新。
示例:
import RealmSwift
class User: Object {
@objc dynamic var name = ""
}
let realm = try! Realm()
let user = User()
user.name = "John"
// 存储数据
try! realm.write {
realm.add(user)
}
// 查询数据
let users = realm.objects(User.self)
print(users)
NSCoding / Codable
用途:将自定义对象序列化为文件存储。
特点:
NSCoding 是 Objective-C 的协议,Codable 是 Swift 的协议。
适合存储自定义对象。
示例(使用 Codable):
struct User: Codable {
let name: String
}
let user = User(name: "John")
let encoder = JSONEncoder()
if let data = try? encoder.encode(user) {
UserDefaults.standard.set(data, forKey: "user")
}
if let data = UserDefaults.standard.data(forKey: "user") {
let decoder = JSONDecoder()
if let user = try? decoder.decode(User.self, from: data) {
print(user.name)
}
}