Sobes.tech
Junior

Խոսեք UserDefaults-ում տվյալների կոդավորումը և դեկոդավորումը մասին։

sobes.tech AI

Պատասխան AI-ից

UserDefaults պահպանում է տվյալները բանալի-արժեք ձևաչափով: Տարբերակային տվյալների տեսակների համար, որոնք ուղղակիորեն չեն աջակցվում (String, Int, Bool, Data, Array, Dictionary), անհրաժեշտ է կոդավորել/դեկոդավորել: Օգտագործվում է Codable պրոտոկոլը, որը միավորում է Encodable և Decodable-ը:

Անհրաժեշտ է հատուկ տիպի կոդավորումը:

struct User: Codable {
    let name: String
    let age: Int
}

let user = User(name: "Иван", age: 30)

PropertyListEncoder և PropertyListDecoder-ների միջոցով կարելի է կոդավորել/դեկոդավորել Codable օբյեկտները Data-ի մեջ, որոնք պահվում են UserDefaults-ում:

Կոդավորում:

let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
    UserDefaults.standard.set(encoded, forKey: "currentUser")
}

Դեկոդավորում:

if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
    let decoder = PropertyListDecoder()
    if let loadedUser = try? decoder.decode(User.self, from: savedData) {
        print("Բեռնված օգտվող: \(loadedUser.name), տարիքը: \(loadedUser.age)")
    }
}

Այլընտրանքային մեթոդ (քիչ թե ավելի քիչ խորհուրդ է տրվում նոր նախագծերի համար). օգտագործել NSCoding և ժառանգել NSObject-ից:

Մեթոդների համեմատություն:

Մեթոդ Պրոտոկոլ/Սինֆոն Աջակցում է արժեքային/հղման տիպերին Պահանջվող մեթոդներ Հեշտություն
Codable Codable (Encodable, Decodable) Արժեքային և հղման Ավտոմատ իրականացում պայմանների բավարարության դեպքում Բարձր
NSCoding NSCoding Հղման (պահանջում է NSObject) init(coder:), encode(with:) Միջին

Codable-ը ժամանակակից և խորհուրդ է տրվում օգտագործել, քանի որ հեշտ է և ավտոմատ սինթեզվում է: NSCoding-ը կարող է անհրաժեշտ լինել հին կոդի աջակցման համար: