1.單粒
// 創(chuàng)建單粒類
class SingletonClass2 {
static let shared = SingletonClass2()
private init(){}
}
// 打印對(duì)象的內(nèi)存地址
let address = Unmanaged.passUnretained(SingletonClass2.shared).toOpaque()
let address1 = Unmanaged.passUnretained(SingletonClass2.shared).toOpaque()
let address2 = Unmanaged.passUnretained(SingletonClass2.shared).toOpaque()
let address3 = Unmanaged.passUnretained(SingletonClass2.shared).toOpaque()
print(address)
print(address1)
print(address2)
print(address3)
/*
0x00006000024595f0
0x00006000024595f0
0x00006000024595f0
0x00006000024595f0
*/
2.存儲(chǔ)對(duì)象(歸檔/解歸檔)
- 用到 KakaJSON 框架
工具類 ArchiveTool.swift
// 歸檔和解歸檔工具類
import UIKit
import KakaJSON
class ArchiveTool {
/// 文件夾名稱
static let kArchive = "archive"
/// 存儲(chǔ)歸檔
///
/// - Parameter object: 要?dú)w檔的對(duì)象
/// - Returns: YES: 歸檔成功 NO: 歸檔失敗
static func saveObject(object: Any) {
// 存放的文件路徑
let path = getPathWithPrefix(classType: object)
// 保存
write(object, to: path)
}
/// 刪除歸檔
///
/// - Parameter classType: 要?jiǎng)h除歸檔的類對(duì)象
/// - Returns: true: 刪除成功 false: 刪除失敗
static func deleteArchiveClass(classType: Any) -> Bool {
// 獲取類名
let className = String(describing: type(of: classType))
if className.isEmpty { // 沒有值
return false
}
let tempCaches = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
guard let caches = tempCaches else { return true }
let filePathFolder = caches + "/" + kArchive
if !FileManager.default.fileExists(atPath: filePathFolder) { // 不存在
return true
}
let fileName = filePathFolder + "/" + className + ".archive"
do {
try FileManager.default.removeItem(atPath: fileName)
return true
} catch {
print("\(classType)--刪除歸檔失敗")
return false
}
}
/// 獲取類名
///
/// - Parameter classType: 類對(duì)象
/// - Returns: 類名
static func getClassName(classType: Any) -> String {
let className = String(describing: type(of: classType))
return className
}
/// 存放的文件路徑
///
/// - Parameter prefix: 文件名稱
/// - Returns: 文件的路徑
static func getPathWithPrefix(classType: Any) -> String {
// 獲取類名
let className = String(describing: type(of: classType))
if className.isEmpty { // 沒有值
return ""
}
let tempCaches = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
guard let caches = tempCaches else { return "" }
let filePathFolder = caches + "/" + kArchive
if !FileManager.default.fileExists(atPath: filePathFolder) { // 不存在
do {
try FileManager.default.createDirectory(atPath: filePathFolder, withIntermediateDirectories: true, attributes: nil)
}catch {
print("存放的文件路徑 error", error)
return ""
}
}
return filePathFolder + "/" + className + ".archive"
}
}
使用示例
// 創(chuàng)建結(jié)構(gòu)體 繼承Convertible
struct Person: Convertible {
var name: String = "淺宇洛"
var age: Int = 26
}
// 存儲(chǔ)Person對(duì)象
ArchiveTool.saveObject(object: Person())
// 讀取Person對(duì)象
let model = read(Person.self, from: ArchiveTool.getPathWithPrefix(classType: Person()))
print("測(cè)試模型", model ?? AllModel())
// 測(cè)試模型 Person(name: "淺宇洛", age: 26)
// 刪除歸檔的Person對(duì)象
let result = ArchiveTool.deleteArchiveClass(classType: Person())
print(result)
// true