Swift Codable 协议…编码/解码 NSCoding 类
Swift Codable protocol… encoding / decoding NSCoding classes
我有以下结构……
struct Photo: Codable {
let hasShadow: Bool
let image: UIImage?
enum CodingKeys: String, CodingKey {
case `self`, hasShadow, image
}
init(hasShadow: Bool, image: UIImage?) {
self.hasShadow = hasShadow
self.image = image
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
hasShadow = try container.decode(Bool.self, forKey: .hasShadow)
// This fails
image = try container.decode(UIImage?.self, forKey: .image)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(hasShadow, forKey: .hasShadow)
// This also fails
try container.encode(image, forKey: .image)
}
}
编码 Photo
失败,显示...
Optional does not conform to Encodable because UIImage does
not conform to Encodable
解码失败...
Key not found when expecting non-optional type Optional for
coding key \"image\""))
有没有办法对 Swift 对象进行编码,这些对象包含符合 NSCoding
(UIImage
、UIColor
等)的 NSObject
子类属性?
感谢@vadian 给我指点 encoding/decoding Data
…
class Photo: Codable {
let hasShadow: Bool
let image: UIImage?
enum CodingKeys: String, CodingKey {
case hasShadow, imageData
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
hasShadow = try container.decode(Bool.self, forKey: .hasShadow)
if let imageData = try container.decodeIfPresent(Data.self, forKey: .imageData) {
image = NSKeyedUnarchiver.unarchiveObject(with: imageData) as? UIImage
} else {
image = nil
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(hasShadow, forKey: .hasShadow)
if let image = image {
let imageData = NSKeyedArchiver.archivedData(withRootObject: image)
try container.encode(imageData, forKey: .imageData)
}
}
}
我有以下结构……
struct Photo: Codable {
let hasShadow: Bool
let image: UIImage?
enum CodingKeys: String, CodingKey {
case `self`, hasShadow, image
}
init(hasShadow: Bool, image: UIImage?) {
self.hasShadow = hasShadow
self.image = image
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
hasShadow = try container.decode(Bool.self, forKey: .hasShadow)
// This fails
image = try container.decode(UIImage?.self, forKey: .image)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(hasShadow, forKey: .hasShadow)
// This also fails
try container.encode(image, forKey: .image)
}
}
编码 Photo
失败,显示...
Optional does not conform to Encodable because UIImage does not conform to Encodable
解码失败...
Key not found when expecting non-optional type Optional for coding key \"image\""))
有没有办法对 Swift 对象进行编码,这些对象包含符合 NSCoding
(UIImage
、UIColor
等)的 NSObject
子类属性?
感谢@vadian 给我指点 encoding/decoding Data
…
class Photo: Codable {
let hasShadow: Bool
let image: UIImage?
enum CodingKeys: String, CodingKey {
case hasShadow, imageData
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
hasShadow = try container.decode(Bool.self, forKey: .hasShadow)
if let imageData = try container.decodeIfPresent(Data.self, forKey: .imageData) {
image = NSKeyedUnarchiver.unarchiveObject(with: imageData) as? UIImage
} else {
image = nil
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(hasShadow, forKey: .hasShadow)
if let image = image {
let imageData = NSKeyedArchiver.archivedData(withRootObject: image)
try container.encode(imageData, forKey: .imageData)
}
}
}