Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在swift中使用UUID()和json_Json_Swift_Codable_Decodable - Fatal编程技术网

在swift中使用UUID()和json

在swift中使用UUID()和json,json,swift,codable,decodable,Json,Swift,Codable,Decodable,我在网上找到了一些在json文件中使用硬编码uuid的例子,这些uuid非常适合我,但是当我在我的应用程序中添加从json数组中删除项目的功能时,我需要动态创建这些uuid 这是我的json文件list.json,它以前有像id:1这样的硬编码id,在我使用int作为id时工作 [ { 名称:沙丘, 作者:弗兰克·赫伯特, 页码:77 }, { 名称:Ready Player 1, 作者:欧内斯特·克莱恩, 页码:234 }, { 名字:东方快车谋杀案, 作者:阿加莎·克里斯蒂, 页码:133

我在网上找到了一些在json文件中使用硬编码uuid的例子,这些uuid非常适合我,但是当我在我的应用程序中添加从json数组中删除项目的功能时,我需要动态创建这些uuid

这是我的json文件list.json,它以前有像id:1这样的硬编码id,在我使用int作为id时工作

[ { 名称:沙丘, 作者:弗兰克·赫伯特, 页码:77 }, { 名称:Ready Player 1, 作者:欧内斯特·克莱恩, 页码:234 }, { 名字:东方快车谋杀案, 作者:阿加莎·克里斯蒂, 页码:133 } ] 这是我的结构书

结构书:可散列、可编码、可识别{ 变量id=UUID 变量名称:String var作者:String 变量页:字符串 } 当我用这个结构和代码Data.swift解码json文件时

let bookData:[Book]=loadlist.json func load_uu文件名:String->T{ 让数据:数据 guard let file=Bundle.main.urlforResource:文件名,扩展名:nil 否则{ 在主捆绑包中找不到\filename。 } 做{ data=尝试DatacontentsOf:文件 }抓住{ FatalError无法从主捆绑包加载\filename:\n\error } 做{ let decoder=JSONDecoder 返回try decoder.decodeT.self,from:data }抓住{ FatalError无法将\filename解析为\t.self:\n\error } } 执行上一个致命错误是因为id键没有与之关联的值,因为我在json文件中删除了它


如何使用id初始化json文件,以便结构中的id=UUID语句可以为其分配唯一id?

在这种情况下,您必须指定CodingKeys并省略id


显然,不会修改结构成员,所以将它们声明为常量。

好的,下面是我的解决方案。现在,我将在使用变量为=UUID.uuidstring的可编码函数时填充id字段,而不是动态填充id字段。因此,我的示例将具有硬编码id,但当人们将自己的书籍添加到我的应用程序中时,我的应用程序将生成id。这是一个简单的解决方案,但作为初学者,我不知道要查找什么。

我想我在Reddit上看到了你的帖子

可以为生成UUID的Book结构创建init。事实上,您可以为一个对象创建多个init,这些init请求不同的输入,或者根据您希望构建逻辑的运行方式为各种参数提供默认值。这很方便

如果UUID是数据结构的重要组成部分,则应将其保留在CodableKeys中


您可能想考虑运行时生成的UUID是否真的是您希望的唯一对象。是否希望多个对象共享相同的标题和作者?用户可能会忘记他们添加了一本特定的书。你想使用ISBNs还是自己尝试独特的东西,比如检测重复或接近重复的标题,并询问用户是否真的想在同一本书的两本上翻倍?

是的,你看到了我的reddit post feral,对吗?我实现了init,我还决定在我的应用程序正常运行后,在版本2更新中实现isbns。听起来像是一个挑战。临时工作是一个友好的重复数据消除消息。GoogleBooks和OpenLibrary都有API,可以用请求填充图书详细信息。这些API看起来很有趣,一旦我对JSONECODable有了一些正确的了解,我就会开始在我的应用程序中处理错误消息
struct Book: Hashable, Codable, Identifiable {
    let id = UUID()
    let name: String
    let author: String
    let page: String

    private enum CodingKeys : String, CodingKey { case name, author, page }
}