Xcode报错:Class ‘JSONEncoder’ requires that ‘ExpenseItem’ conform to ‘Encodable’
Xcode报错:Class ‘JSONEncoder’ requires that ‘ExpenseItem’ conform to ‘Encodable’

Xcode报错:Class ‘JSONEncoder’ requires that ‘ExpenseItem’ conform to ‘Encodable’

在我尝试使用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就可以同时被编码和解码。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注