Hello everyone, I am trying to save data into phone, I got this error.
Type 'Item' does not conform to protocol 'Encodable/Decodable'
Later I googled and modified my code with enumeration, without understanding it. Fortunetly I still get the same error. Can someone explain to me how can I make it work?
import SwiftUI
class ArrayofItems: ObservableObject, Identifiable, Codable {
var items: [Item] = []
func addnewItem(itemName: String, itemCount: Int){
items.append(Item(itemName: itemName, itemCount: itemCount))
}
}
class Item: ObservableObject, Identifiable, Codable {
enum CodingKeys: CodingKey {
case itemName
case id
case itemCount
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
itemName = try container.decode(String.self, forKey: .itemName)
itemCount = try container.decode(Int.self, forKey: .itemCount)
}
@Published var id = UUID()
@Published var itemName: String
@Published var itemCount: Int
init(itemName: String, itemCount: Int) {
self.itemName = itemName
self.itemCount = itemCount
}
func add() {
itemCount += 1
}
func sub() {
itemCount -= 1
}
}
extension Item {
static var sample: [Item] {
[
Item(itemName: "Item1", itemCount: 3),
Item(itemName: "Item2", itemCount: 1),
Item(itemName: "Item3", itemCount: 2)
]
}
}
import Foundation
@MainActor
class allofItems: ObservableObject {
@Published var allItems: [ArrayofItems] = []
private static func fileURL() throws -> URL {
try FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false)
.appendingPathComponent("item.data")
}
func load() async throws {
let item = Task<[ArrayofItems], Error> {
let fileURL = try Self.fileURL()
guard let data = try? Data(contentsOf: fileURL) else {
return []
}
let myitems = try JSONDecoder().decode([ArrayofItems].self, from: data)
return myitems
}
let allItems = try await item.value
self.allItems = allItems
}
func save(allItems: [ArrayofItems]) async throws {
let task = Task {
let data = try JSONEncoder().encode(allItems)
let outfile = try Self.fileURL()
try data.write(to: outfile)
}
_ = try await task.value
}
}