类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

Posted

技术标签:

【中文标题】类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议【英文标题】:Type 'Favorites.Type' cannot conform to 'Encodable'; only struct/enum/class types can conform to protocols 【发布时间】:2020-10-27 14:26:28 【问题描述】:

请告诉我这个错误可能是什么问题以及如何解决它?

我正在使用 SwiftUI 2.0

“类型'Favorites.Type'不能符合'Encodable';只有结构/枚举/类类型可以符合协议”

代码:

class Favorites: ObservableObject 

private var tasks: Set<String>
let defaults = UserDefaults.standard

init() 
    let decoder = JSONDecoder()
    if let data = defaults.value(forKey: "Favorites") as? Data 
        let taskData = try? decoder.decode(Set<String>.self, from: data)
        self.tasks = taskData ?? []
     else 
        self.tasks = []
    


func getTaskIds() -> Set<String> 
    return self.tasks


func isEmpty() -> Bool 
    tasks.count < 1


func contains(_ task: dataTypeFont) -> Bool 
    tasks.contains(task.id)


func add(_ task: dataTypeFont) 
    objectWillChange.send()
    tasks.insert(task.id)
    save()


func remove(_ task: dataTypeFont) 
    objectWillChange.send()
    tasks.remove(task.id)
    save()


func save() 
    let encoder = JSONEncoder()
    if let encoded = try? encoder.encode(Favorites)  
        defaults.set(encoded, forKey: "Favorites")
    

屏幕截图错误: Error

【问题讨论】:

【参考方案1】:

错字。

根据 load 方法,您必须编码 tasks 而不是类类型

func save() 
    let encoder = JSONEncoder()
    if let encoded = try? encoder.encode(tasks)  
        defaults.set(encoded, forKey: "Favorites")
    

并且不要将value(forKey:UserDefaults一起使用,有专门的方法

if let data = defaults.data(forKey: "Favorites") 

【讨论】:

以上是关于类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议的主要内容,如果未能解决你的问题,请参考以下文章

使用 if 语句时:类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议

协议类型不能符合协议,因为只有具体类型才能符合协议

“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”

类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议

协议类型“Encodable”的值不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

type() 不能符合 View;只有结构/枚举/类类型可以符合协议