Sobes.tech
Junior

Ինչպես պահել և կարդալ տվյալների կառուցվածքը User Defaults-ով?

sobes.tech AI

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

User Defaults պահում է միայն սահմանափակ տեսակի հավաքածու՝ Data, String, Number, Date, Array, Dictionary: Տարբերակային կառուցվածքների պահպանումը պահանջում է դրանք կոդավորել Data-ի և հետագայում դեկոդավորել։

Օգտագործվում է Codable պրոտոկոլը (կամ Encodable և Decodable-ի համակցում):

  1. Կառուցվածքի սահմանում: Կառուցվածքը պետք է համապատասխաներ Codable-ին:

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Պահպանում: Կոդավորել կառուցվածքը Data-ի և պահել User Defaults-ում:

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Կոդավորում Data-ով
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Պահպանում Data-ով
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Կոդավորման սխալի մշակումը
        print("Failed to encode struct")
    }
    
  3. Կարդալ: Կարդալ Data-ը User Defaults-ից և դեկոդավորել այն վերականգնելու համար:

    // Data- ի ստացում
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Դեկոդավորում
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Օգտագործում վերականգնված կառուցվածքը
            print("Loaded struct: \(loadedStruct)")
        } else {
            // Դեկոդավորման սխալի մշակումը
            print("Failed to decode data")
        }
    } else {
        // Դատարկ տվյալներ
        print("No data found for key")
    }
    

Հիմնական կետեր:

  • User Defaults-ը նախատեսված չէ մեծ ծավալի տվյալների կամ գաղտնի տեղեկատվության համար:
  • Codable և JSONEncoder/JSONDecoder-ի օգտագործումը ստանդարտ էհատուկ տիպերի պահպանումըData`-ում:
  • Պետք է օգտագործել try? և հնարավոր սխալները մշակել:
  • Մասիվների պահպանումն էլ Codable-ի միջոցով է:
// Մասիվ կառուցվածքների պահպանում
let dataArray: [MyData] = [
    MyData(id: 1, name: "A", isActive: true),
    MyData(id: 2, name: "B", isActive: false)
]

let encoder = JSONEncoder()
if let encodedArrayData = try? encoder.encode(dataArray) {
    UserDefaults.standard.set(encodedArrayData, forKey: "myCustomArray")
}

// Մասիվ կառուցվածքների ընթերցում
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Loaded array: \(loadedArray)")
    }
}