在我尝试使用JSONEncoder进行编码时
if let encoded = try?JSONEncoder().encode(items) {
UserDefaults.standard.set(encoded, forKey: "Items")
}
提示我下面的报错:
Class 'JSONEncoder' requires that 'ExpenseItem' conform to 'Encodable'
问题原因为JSONEncoder对ExpenseItem对象进行编码时,ExpenseItem没有遵循Encodable协议。
struct ExpenseItem: Identifiable {
var id = UUID()
let name: String
let type: String
let amount: Double
}
在Swift中,JSONEncoder用于将对象编码为JSON格式,而只有遵循Encoder协议的类型才可以被编码。因此,解决方案就是让ExpenseItem遵循Encodable协议。
struct ExpenseItem: Identifiable, Encodable {
var id = UUID()
let name: String
let type: String
let amount: Double
}
遵循Encodable协议后,报错得到解决。如果后续需要JSON解码的话,还需要遵循Decodable协议。实际上,通常会让协议遵循Codable,因为Codable是Encodable和Decodable的组合:
struct ExpenseItem: Identifiable, Codable {
var id = UUID()
let name: String
let type: String
let amount: Double
}
在遵循Codable协议后,ExpenseItem就可以同时被编码和解码。