我希望能够保存一个Custom-struct
到UserDefaults
,但为此我需要它是Codable
..我尝试这样:
struct Wishlist: Codable {
var name: String
var image: UIImage
var wishData: [Wish]
var color: UIColor
var textColor: UIColor
var index: Int
}
但这会得到error
:
类型“愿望单”不符合协议“可解码”
下面是我的Class Wish
,也许这就是问题所在:
class Wish: NSObject {
public var wishName : String?
public var checkedStatus : Bool?
public var wishLink : String?
public var wishPrice : String?
public var wishNote : String?
public var wishImage : UIImage?
init(withWishName name: String, link: String, price: String, note: String, image: UIImage, checked: Bool) {
super.init()
wishName = name
checkedStatus = checked
wishLink = link
wishPrice = price
wishNote = note
wishImage = image
}
}
我到底做错了什么?
3条答案
按热度按时间cqoc49vn1#
您需要使
Wish
采用Codable
。但是因为
UIImage
和UIColor
不是Codable
,所以必须手动实现它们,如Encoding and Decoding Custom Types中所述:这里我将使用这个作为编码
UIColor
对象的一种方便的方法:注意,我做了一些不相关的更改:
struct
,除非必要,否则我不会引入引用类型(更不用说NSObject
子类了)。Wish
中,我们一般不会在属性名中使用wish
前缀。我也不会在属性名中使用“data”,除非它实际上是Data
。init
方法以使用标准命名约定。顺便说一下,另一种方法是完全避免在模型类型中使用UIKit类型。这完全消除了对自定义编码器/解码器的需要。并且您可以拥有特定于平台的扩展,这些扩展提供了必要的便利初始化器,可以桥接到UIKit类型。例如:
注意,我不仅从模型类型中删除了
UIColor
,而且还删除了UIImage
。现在,在上面我将UIImage
移到了Data
,但是实际上,图像负载可能根本不属于这个模型类型。您应该只有图像URL或资产标识符,并且将图像获取和存储与模型一起解耦。(因为图像和模型对象往往具有非常不同的存储器特性,你经常希望在需要的时候获取图像,并将其存储在某个可刷新的缓存中,但这超出了这个问题的范围。)cwtwac6a2#
在您的情况下,您应该添加
CodingKeys
枚举,而不是使用UIColor
或UIImage
数据类型。我以前遇到过相同的错误,但后来我意识到CodingKey与结构不匹配,也没有non-codable
数据类型。只需将数据类型更改为您的自定义可编码对象。错误示例:
从示例中我们知道
trailer
还没有在codingKeys
中。您应该将所有属性添加到CodingKeys
。并且Any
数据类型应该更改为可编码数据类型,如String
、Int
或Trailer
(自定义可编码数据类型)。下面是正确的示例:n9vozmp43#
UIImage
不符合Codable
。您可以先将其转换为Base64,然后将 that 存储在UserDefaults
中。