gpt4 book ai didi

带有字符串和 UIImages 的 Swift Codable 协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:05 27 4
gpt4 key购买 nike

我正在尝试通过可编码协议(protocol)保存数据。它是一个结构数组,里面有结构。有字符串、图像和 bool 值,我认为这是不符合协议(protocol)的数据类型之一。

这是我必须保存的所有数据的图片: original

struct Checklist {

var name: String
var image: UIImage?
var items: [Item] = []
}

struct Item {

var nameOfNote: String
var remind: Bool
//var date: Date
}

struct alldata: Codable {

var checklists: [Checklist] = []
}

我试图将协议(protocol)包含在所有结构中,但它也产生了错误。这是一张照片: tried a solution picture

最佳答案

Swift 4 中的 JSON 很有趣(在凌晨 2 点重复这个 ;))。

我经常做的第一件事就是查阅一个好的博客,比如 Ultimate Guide to JSON Parsing with Swift 4 .虽然它可能无法回答“直接”问题,但它会提供很多有用的信息。

另一件事是查阅 Apple 文档。在此,快速浏览一下 documentation for UIImage会指出它不符合Codable,所以这是个问题。

另一个问题是,JSON 不支持二进制数据,它是一种基于文本的解决方案。

这意味着您需要设法将二进制图像数据转换为文本。幸运的是,人们已经想到了这一点,最常见的机制是使用 Base 64 编码。

快速谷歌搜索将找到任意数量的解决方案,用于将 UIImage 编码/解码为 base 64,例如 Convert between UIImage and Base64 string

现在,我们只需要自定义编码和解码过程即可。

首先要确保我们使用的所有其他字段/对象/数据也符合 Codable...

struct Item: Codable {
var nameOfNote: String
var remind: Bool
//var date: Date
}

然后我们就可以着手定制图像的编码和解码过程,也许是...

struct Checklist: Codable {

enum CodingKeys: String, CodingKey {
case image
case name
case items
}

var name: String
var image: UIImage?
var items: [Item] = []

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
items = try container.decode([Item].self, forKey: .items)

if let text = try container.decodeIfPresent(String.self, forKey: .image) {
if let data = Data(base64Encoded: text) {
image = UIImage(data: data)
}
}
}

func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)

if let image = image, let data = image.pngData() {
try container.encode(data, forKey: .image)
}
try container.encode(name, forKey: .name)
try container.encode(items, forKey: .items)
}
}

nb:这是我在几个项目中使用的基本过程,我自己没有测试过以上内容,但它应该展示了您入门所需的基本思想

关于带有字符串和 UIImages 的 Swift Codable 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com