Swift 4有Codable,非常棒。但是UIImage
默认情况下不符合它。我们该怎么做呢?
我尝试使用singleValueContainer
和unkeyedContainer
extension UIImage: Codable {
// 'required' initializer must be declared directly in class 'UIImage' (not in an extension)
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let data = try container.decode(Data.self)
guard let image = UIImage(data: data) else {
throw MyError.decodingFailed
}
// A non-failable initializer cannot delegate to failable initializer 'init(data:)' written with 'init?'
self.init(data: data)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
guard let data = UIImagePNGRepresentation(self) else {
return
}
try container.encode(data)
}
}
我收到了2个错误
- 'required'初始化器必须直接在类 'UIImage' 中声明(而不是在扩展中)
- 非可失败初始化器不能委托给使用'init?'编写的可失败初始化器'init(data:)'
一种解决方法是使用包装器。但还有其他方法吗?
UIImage
的子类,并符合Codable
协议,然后在其上添加所需的初始化程序。 - TorongoUIImage
转换为Codable
?通常来说,图片并不适合被编码成 JSON 或 XML 等格式。一般来说最好是将图片单独编码,然后在 JSON 中编码一个 URL 之类的东西。 - HamishJSONEncoder
?但这只是Encoder
协议的一个实现。 - onmyway133Foundation
提供的编码器/解码器的假设。 - Hamish