У меня есть кодируемая структура:
struct Foo: Codable {
let rect: CGRect
let image: UIImage
init(rect: CGRect, image: UIImage) {
self.rect = rect
self.image = image
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(rect, forKey: .rect)
try container.encode(UIImagePNGRepresentation(image), forKey: .image)
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
rect = try container.decode(CGRect.self, forKey: .rect)
image = try UIImage(data: container.decode(Data.self, forKey: .image))!
}
enum CodingKeys : CodingKey {
case rect
case image
}
}
Теперь я создаю Foo
и пытаюсь его закодировать и расшифровать:
let image = UIImage(named: "my_image")
let foo = Foo(rect: .zero, image: image!)
let encoder = PropertyListEncoder()
let data = try! encoder.encode(foo)
let decoder = PropertyListDecoder()
try! decoder.decode(Foo.self, from: data)
Теперь в строке decode
возникает эта ошибка:
Swift.DecodingError.typeMismatch (Foundation.Data, Swift.DecodingError.Context (codingPath: [__lldb_expr_244.Foo.CodingKeys.image], debugDescription: «Ожидается декодирование данных, но вместо этого обнаружен массив.», LowerError: nil))
По-видимому, декодер обнаружил массив при попытке декодирования данных изображения. Почему так происходит? Кажется, что каким-то образом Data
становится массивом. Я очень запутался, потому что
Data() is Codable
оценивается как истина, поэтому кодировщики теоретически должны иметь возможность en / декодировать Data
. Почему он стал массивом?
Изменить: я использую Xcode 9.1
Вот my_image
: