如何將自己的對(duì)象類型寫(xiě)入文件龟糕,在ios開(kāi)發(fā)中

在iOS開(kāi)發(fā)中桐磁,將自定義對(duì)象類型寫(xiě)入文件通常需要將對(duì)象序列化為一種可以存儲(chǔ)的格式,例如JSON讲岁、XML我擂、二進(jìn)制數(shù)據(jù)或歸檔對(duì)象。以下是幾種常見(jiàn)的方法:
方法1:使用NSCoding協(xié)議進(jìn)行歸檔
NSCoding協(xié)議允許你將對(duì)象序列化為二進(jìn)制數(shù)據(jù)缓艳,然后存儲(chǔ)到文件中校摩。這種方法適用于需要存儲(chǔ)復(fù)雜對(duì)象或?qū)ο髨D的場(chǎng)景。
步驟:
讓自定義類遵守NSCoding協(xié)議
實(shí)現(xiàn)encode(with:)方法阶淘,用于將對(duì)象的屬性編碼為二進(jìn)制數(shù)據(jù)衙吩。
實(shí)現(xiàn)init?(coder:)方法,用于從二進(jìn)制數(shù)據(jù)解碼對(duì)象溪窒。
歸檔對(duì)象
使用NSKeyedArchiver將對(duì)象歸檔為二進(jìn)制數(shù)據(jù)并寫(xiě)入文件坤塞。
解檔對(duì)象
使用NSKeyedUnarchiver從文件中讀取二進(jìn)制數(shù)據(jù)并解碼為對(duì)象。
示例代碼:
swift復(fù)制
import Foundation

// 定義一個(gè)遵守 NSCoding 協(xié)議的自定義類
class Person: NSObject, NSCoding {
var name: String
var age: Int

init(name: String, age: Int) {
    self.name = name
    self.age = age
}

// 編碼方法
func encode(with coder: NSCoder) {
    coder.encode(name, forKey: "name")
    coder.encode(age, forKey: "age")
}

// 解碼方法
required init?(coder: NSCoder) {
    guard let name = coder.decodeObject(forKey: "name") as? String else { return nil }
    let age = coder.decodeInteger(forKey: "age")
    self.name = name
    self.age = age
}

}

// 歸檔對(duì)象到文件
func archivePerson(person: Person, toFile filePath: String) {
let success = NSKeyedArchiver.archiveRootObject(person, toFile: filePath)
if success {
print("對(duì)象已成功歸檔到文件:(filePath)")
} else {
print("歸檔失敗")
}
}

// 從文件解檔對(duì)象
func unarchivePerson(fromFile filePath: String) -> Person? {
guard let person = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? Person else {
print("解檔失敗")
return nil
}
return person
}

// 示例:使用歸檔和解檔
let person = Person(name: "John Doe", age: 30)
let filePath = "/path/to/person.archive"

// 歸檔
archivePerson(person: person, toFile: filePath)

// 解檔
if let loadedPerson = unarchivePerson(fromFile: filePath) {
print("加載的姓名:(loadedPerson.name)澈蚌,年齡:(loadedPerson.age)")
}
方法2:使用Codable協(xié)議進(jìn)行JSON序列化
Codable協(xié)議是Swift 4引入的摹芙,用于將對(duì)象序列化為JSON數(shù)據(jù),這種方法適用于需要將數(shù)據(jù)存儲(chǔ)為文本格式或與其他系統(tǒng)交互的場(chǎng)景宛瞄。
步驟:
讓自定義類或結(jié)構(gòu)體遵守Codable協(xié)議
Codable是一個(gè)類型別名浮禾,表示同時(shí)遵守Encodable和Decodable協(xié)議。
將對(duì)象序列化為JSON數(shù)據(jù)
使用JSONEncoder將對(duì)象編碼為JSON數(shù)據(jù)份汗。
將JSON數(shù)據(jù)寫(xiě)入文件
使用Data的write(to:)方法將JSON數(shù)據(jù)寫(xiě)入文件伐厌。
從文件讀取JSON數(shù)據(jù)并解碼為對(duì)象
使用JSONDecoder將JSON數(shù)據(jù)解碼為對(duì)象。
示例代碼:
swift復(fù)制
import Foundation

// 定義一個(gè)遵守 Codable 協(xié)議的自定義結(jié)構(gòu)體
struct Person: Codable {
var name: String
var age: Int
}

// 將對(duì)象序列化為 JSON 數(shù)據(jù)并寫(xiě)入文件
func savePerson(person: Person, toFile filePath: String) throws {
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // 格式化輸出
let jsonData = try encoder.encode(person)
try jsonData.write(to: URL(fileURLWithPath: filePath))
print("對(duì)象已成功保存到文件:(filePath)")
}

// 從文件讀取 JSON 數(shù)據(jù)并解碼為對(duì)象
func loadPerson(fromFile filePath: String) throws -> Person {
let jsonData = try Data(contentsOf: URL(fileURLWithPath: filePath))
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: jsonData)
return person
}

// 示例:使用 JSON 編碼和解碼
let person = Person(name: "John Doe", age: 30)
let filePath = "/path/to/person.json"

do {
// 保存到文件
try savePerson(person: person, toFile: filePath)

// 從文件加載
let loadedPerson = try loadPerson(fromFile: filePath)
print("加載的姓名:\(loadedPerson.name)裸影,年齡:\(loadedPerson.age)")

} catch {
print("發(fā)生錯(cuò)誤:(error)")
}
方法3:使用UserDefaults存儲(chǔ)簡(jiǎn)單數(shù)據(jù)
如果你需要存儲(chǔ)簡(jiǎn)單的數(shù)據(jù)(如字符串挣轨、數(shù)字、數(shù)組等)轩猩,可以使用UserDefaults卷扮。這種方法適用于存儲(chǔ)少量的配置數(shù)據(jù)或用戶偏好設(shè)置。
示例代碼:
swift復(fù)制
import Foundation

// 保存數(shù)據(jù)到 UserDefaults
func saveDataToUserDefaults(name: String, age: Int) {
let defaults = UserDefaults.standard
defaults.set(name, forKey: "name")
defaults.set(age, forKey: "age")
print("數(shù)據(jù)已保存到 UserDefaults")
}

// 從 UserDefaults 加載數(shù)據(jù)
func loadDataFromUserDefaults() -> (name: String?, age: Int?) {
let defaults = UserDefaults.standard
let name = defaults.string(forKey: "name")
let age = defaults.integer(forKey: "age")
return (name, age)
}

// 示例:使用 UserDefaults
saveDataToUserDefaults(name: "John Doe", age: 30)

if let name = loadDataFromUserDefaults().name, let age = loadDataFromUserDefaults().age {
print("加載的姓名:(name)均践,年齡:(age)")
}
方法4:使用數(shù)據(jù)庫(kù)(如Core Data或SQLite)
如果需要存儲(chǔ)大量結(jié)構(gòu)化數(shù)據(jù)晤锹,可以使用數(shù)據(jù)庫(kù)。Core Data是iOS開(kāi)發(fā)中常用的ORM框架彤委,而SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)鞭铆。
示例:使用Core Data
創(chuàng)建Core Data模型
在Xcode中創(chuàng)建一個(gè)新的Core Data模型文件(.xcdatamodeld),定義實(shí)體和屬性。
保存數(shù)據(jù)到Core Data
使用NSManagedObjectContext插入和保存數(shù)據(jù)车遂。
從Core Data加載數(shù)據(jù)
使用NSFetchRequest查詢數(shù)據(jù)封断。
示例代碼(Core Data):
swift復(fù)制
import CoreData

// 獲取 Core Data 的上下文
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
let context = appDelegate.persistentContainer.viewContext

// 創(chuàng)建一個(gè)新的 Person 實(shí)體
let person = Person(context: context)
person.name = "John Doe"
person.age = 30

// 保存上下文
do {
try context.save()
print("數(shù)據(jù)已成功保存到 Core Data")
} catch {
print("保存失敗:(error)")
}

// 查詢數(shù)據(jù)
let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
do {
let results = try context.fetch(fetchRequest)
for person in results {
print("姓名:(person.name ?? "未知")舶担,年齡:(person.age)")
}
} catch {
print("查詢失斊绿邸:(error)")
}
總結(jié)
NSCoding:適用于復(fù)雜對(duì)象的二進(jìn)制歸檔,適合本地存儲(chǔ)衣陶。
Codable:適用于JSON序列化柄瑰,適合本地存儲(chǔ)或網(wǎng)絡(luò)傳輸。
UserDefaults:適用于存儲(chǔ)簡(jiǎn)單的配置數(shù)據(jù)剪况。
數(shù)據(jù)庫(kù)(如Core Data或SQLite):適用于存儲(chǔ)大量結(jié)構(gòu)化數(shù)據(jù)教沾。
根據(jù)你的具體需求選擇合適的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末译断,一起剝皮案震驚了整個(gè)濱河市详囤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镐作,老刑警劉巖藏姐,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異该贾,居然都是意外死亡羔杨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)杨蛋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兜材,“玉大人,你說(shuō)我怎么就攤上這事逞力∈锕眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵寇荧,是天一觀的道長(zhǎng)举庶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)揩抡,這世上最難降的妖魔是什么户侥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮峦嗤,結(jié)果婚禮上蕊唐,老公的妹妹穿的比我還像新娘。我一直安慰自己烁设,他們只是感情好替梨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般副瀑。 火紅的嫁衣襯著肌膚如雪弓熏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天俗扇,我揣著相機(jī)與錄音硝烂,去河邊找鬼箕别。 笑死铜幽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的串稀。 我是一名探鬼主播除抛,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼母截!你這毒婦竟也來(lái)了到忽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤清寇,失蹤者是張志新(化名)和其女友劉穎喘漏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體华烟,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翩迈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盔夜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负饲。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喂链,靈堂內(nèi)的尸體忽然破棺而出返十,到底是詐尸還是另有隱情,我是刑警寧澤椭微,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布洞坑,位于F島的核電站,受9級(jí)特大地震影響蝇率,放射性物質(zhì)發(fā)生泄漏检诗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一瓢剿、第九天 我趴在偏房一處隱蔽的房頂上張望逢慌。 院中可真熱鬧,春花似錦间狂、人聲如沸攻泼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忙菠。三九已至何鸡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牛欢,已是汗流浹背骡男。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傍睹,地道東北人隔盛。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拾稳,于是被迫代替她去往敵國(guó)和親吮炕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容