在 Swift 4 中实现自定义解码器

2024-01-08

我想使用新的解码 XML 文档DecodableSwift 4 中引入的协议,但是,似乎没有符合该协议的 XML 解码器的现有实现Decoder协议。

我的计划是使用 SWXMLHash 库来解析 XML,然后可能使XMLIndexer该库中的类扩展了Decoder协议,以便我的模型可以使用实例进行初始化XMLIndexer (XMLIndexer由返回SWXMLHash.parse(xmlString)).

我的问题是我不知道如何实施Decoder协议,我似乎无法在网上找到任何资源来解释它是如何完成的。我找到的每一个资源都严格提到了JSONDecoderSwift 标准库中包含的类,但我发现没有任何资源可以解决创建您自己的自定义解码器的问题。


我还没有机会将我的代码转变为框架,但您可以查看我的 Github 存储库,它实现了 XML 的自定义解码器和编码器。

Link: https://github.com/ShawnMoore/XMLParsing https://github.com/ShawnMoore/XMLParsing

编码器和解码器位于存储库的 XML 文件夹中。它基于 Apple 的 JSONEncoder 和 JSONDecoder,并进行了更改以适应 XML 标准。


XMLDecoder 和 JSONDecoder 之间的区别

  1. XMLDecoder.DateDecodingStrategy有一个额外的案例标题为keyFormatted。这种情况需要一个闭包来为您提供 CodingKey,并且您可以为所提供的键提供正确的 DateFormatter。这只是一个方便的案例日期解码策略JSONDecoder 的。
  2. XMLDecoder.DataDecodingStrategy有一个额外的案例标题为keyFormatted。这种情况需要一个闭包来为您提供 CodingKey,您可以为所提供的密钥提供正确的数据或 nil。这只是一个方便的案例数据解码策略JSONDecoder 的。
  3. 如果符合Codable协议的对象有一个数组,并且正在解析的XML不包含该数组元素,XMLDecoder会为该属性分配一个空数组。这是因为 XML 标准规定,如果 XML 不包含该属性,则可能意味着这些元素为零。

XMLEncoder 和 JSONEncoder 之间的差异

  1. 包含一个名为StringEncodingStrategy,这个枚举有两个选项,deferredToString and cdata. The 延迟到字符串选项是默认的,会将字符串编码为简单字符串。如果cdata被选中时,所有字符串都将被编码为 CData。

  2. The encode函数比 JSONEncoder 还接受两个额外的参数。函数中的第一个附加参数是RootKey字符串,将整个 XML 包装在名为该键的元素中。该参数是必需的。第二个参数是 XMLHeader,它是一个可选参数,如果您想在编码的 xml 中包含此信息,则可以获取版本、编码策略和独立状态。


Examples

有关示例的完整列表,请参阅XML 示例存储库中的文件夹。

要解析的 XML:

<?xml version="1.0"?>
<book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>An in-depth look at creating applications
        with XML.</description>
</book>

斯威夫特结构:

struct Book: Codable {
    var id: String
    var author: String
    var title: String
    var genre: Genre
    var price: Double
    var publishDate: Date
    var description: String
    
    enum CodingKeys: String, CodingKey {
        case id, author, title, genre, price, description
        
        case publishDate = "publish_date"
    }
}

enum Genre: String, Codable {
    case computer = "Computer"
    case fantasy = "Fantasy"
    case romance = "Romance"
    case horror = "Horror"
    case sciFi = "Science Fiction"
}

XML解码器:

let data = Data(forResource: "book", withExtension: "xml") else { return nil }
        
let decoder = XMLDecoder()
        
let formatter: DateFormatter = {
   let formatter = DateFormatter()
   formatter.dateFormat = "yyyy-MM-dd"
   return formatter
}()
        
decoder.dateDecodingStrategy = .formatted(formatter)
        
do {
   let book = try decoder.decode(Book.self, from: data)
} catch {
   print(error)
}

XML编码器:

let encoder = XMLEncoder()
        
let formatter: DateFormatter = {
   let formatter = DateFormatter()
   formatter.dateFormat = "yyyy-MM-dd"
   return formatter
}()
        
encoder.dateEncodingStrategy = .formatted(formatter)
        
do {
   let data = try encoder.encode(self, withRootKey: "book", header: XMLHeader(version: 1.0))
            
   print(String(data: data, encoding: .utf8))
} catch {
   print(error)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 4 中实现自定义解码器 的相关文章

  • 滚动视图下的iOS swift 4 imageview:双击缩小

    我已经应用了图像视图来通过捏合来放大 缩小 那很容易 当在图像视图上应用双击时 无法检测到选择方法 我使用 Xcode 9 和 swift 4 您能告诉我滚动视图是否应该应用双击手势吗 var previewImage UIImage ni
  • Android 键盘清单未显示在设置中

    我正在制作我的第一个 Android 应用程序 我需要它作为键盘服务 据我所知 清单看起来不错 并且我有一个文件 WifiJoy java 在 com zwad3 wifijoy 包中 以及所有其他文件
  • 在 swift 中从本地视频创建缩略图

    如何从本地视频文件快速创建缩略图 例如 如果视频文件路径位于此处 file Users Dev Library Developer CoreSimulator Devices F33222DF D8F0 448B A127 C5B03C64
  • 用于冒号分隔标签的 XML 解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 手动设置时间和日期时,iOS 10 中的重复每日本地通知不会被触发?

    我正在尝试通过触发每日通知来测试 iOS 10 中的本地通知 我正在使用以下示例项目 通知UI 演示 https github com appcoda NotificationsUI Demo 该应用程序中有以下代码之一 let calen
  • 在 ARKit 和 RealityKit 中使用 Raycast 的真正好处是什么?

    RealityKit 和 ARKit 中的光线投射有何用途 我什么时候需要使用makeRaycast查询 https developer apple com documentation realitykit arview 3255315 m
  • ElementTree 和 Element 有什么区别? (Python XML)

    from xml etree ElementTree import ElementTree Element SubElement dump elem Element 1 sub SubElement elem 2 tree ElementT
  • 如何将 4 个字节转换为 Swift 浮点数?

    我正在用 Swift 编写一个 MsgPack 解析器作为学习该语言的一种方式 感觉不太适合这项任务 但我一直在进步 现在我遇到了一个块 我似乎无法说服它将 4 个字节转换为浮点数 var bytes Array
  • 在 WSDL 中包含 XSD

    我正在编写一个 wsdl 文件来在未来 SoapUI 中部署模拟服务 但我在包含我的 xsd 文件时遇到问题 XSD File
  • OSX Swift 在默认浏览器中打开 URL

    如何使用 Swift 作为编程语言和 OSX 作为平台在系统默认浏览器中打开 URL 我发现了很多UIApplication like UIApplication sharedApplication openURL NSURL string
  • Swift - 必须由子类覆盖的类方法

    是否有一种标准方法可以在 Swift 中创建 纯虚函数 即 一个must被每个子类覆盖 如果不是 会导致编译时错误 您有两个选择 1 使用协议 将超类定义为协议而不是类 Pro 编译时检查每个 子类 不是实际的子类 是否实现了所需的方法 C
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • 解包可选值时意外发现 nil - 使用 ALAMOFIRE

    我正在尝试使用 Alamofire 获取 JSON 格式的数据 当我使用一个 URL 时 它工作正常 当我使用另一个 URL 时 我在解包可选值时收到错误 我似乎无法追踪错误来自哪里 我已采取将代码放入 ViewDidLoad 来跟踪错误
  • 无法在 Swift 中创建文件路径

    我尝试在 Swift 中打开该文件 为此 我创建了文件路径 这不起作用 maaaacy pwd Users tsypa maaaacy cat a txt test maaaacy a swift nil maaaacy 剧本 usr bi
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • 使用 C# 编辑 XML 文档

    我在解决如何将元素添加到 XML 文档中时遇到了一些麻烦 我想将热点信息添加到 xml 中 其中 Id 正确 因此 id 2 添加热点信息 这是我当前的 XML
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 在 XSD 中哪里放置版权信息?

    将版权信息放入 XML 架构定义 XSD 时 是否有官方 或半官方 普遍接受的 位置 基于在哪里将版本添加到 XSD 架构 https stackoverflow com questions 2138705 where to add a v
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa

随机推荐

  • 如何在 T-SQL 调试时查看表变量的值?

    在调试期间 我们能否在 SQL Server Management Studio SSMS 中查看表值变量中的值 行和单元格 如果是 怎么办 DECLARE v XML SELECT FROM
  • 本地使用 Cognito [离线]

    我有一种感觉 这是一个菜鸟问题 有没有办法在本地模拟 Cognito 用户池的使用 如此离线 我有一种感觉 在开发时诉诸 aws cognito 普通用户池是没有必要的 我现在知道无服务器有一个可以离线使用的插件 但没有找到用于 cogni
  • 在模拟中控制内存分配/GC?

    我在弄清楚如何减少运行在模拟中的内存使用和 GC 时间时遇到了一些麻烦State单子 目前我必须运行编译后的代码 RTS K100M为了避免堆栈空间溢出 GC 统计数据非常可怕 见下文 以下是相关代码片段 完整的工作 GHC 7 4 1 代
  • 整数是如何在底层转换为字符串的?

    我想真正的问题是如何将 base2 binary 转换为 base10 最常见的应用可能是创建输出字符串 将二进制数字数据块转换为字符数组 这具体是如何完成的 我猜 鉴于可能没有为每个数值预定义一个字符串 我猜测计算机从右到左遍历整数的每一
  • arc4random 和 % 运算符

    我对 Objective C 中的 arc4random 函数有疑问 我在网上看到的例子中有一个 函数调用后的符号 我想 作为模运算符 该符号在之后使用时是否有其他含义arc4random 它是如何工作的 没有什么特殊意义 之后应用模数ar
  • C#中如何判断数字是否可被整除?

    我需要知道如何执行此程序 calculation1 1 4 0 25 calculation2 1 8 0 125 calculation3 47 183 0 25683060109289617486338797814207 calcula
  • 图数据库新手Q-如何决定2个节点之间关系的方向

    你如何决定关系的动词方向 例如 我有一个国家属于子区域 而子区域又属于区域 哪一个更好 在决定方向方面有什么经验法则吗 地区 HAS gt 子区域 HAS gt 国家 地区 or 区域 问候 桑 我同意 InverFalcon 的观点 即方
  • 无法在 spring-boot 应用程序中从 Consul 读取配置

    我正在创建一个Spring Boot应用程序 它将读取诸如数据库属性之类的配置Consul 但我无法使用我的应用程序从 Consul 读取键值 以下是我正在尝试做的事情 pom xml
  • System.UnauthorizedAccessException:对路径的访问被拒绝

    无论我做什么 例如授予网络服务和 ASP NET 帐户对包含图像的文件夹的完全权限 我仍然收到 System IO File Move 的此错误 有人知道我在这里可能还缺少哪些其他帐户吗 网络服务是运行应用程序池的帐户 该网站在该应用程序池
  • 使用python检测关闭事件

    我有一个 Minecraft 基岩版服务器在我们的共享电脑上运行 我想通过 python 与它交互 然而 我遇到的一个问题是我的兄弟有时会重新启动我们的电脑或 Windows 更新 我需要知道如何检测关闭事件并在重新启动之前将关闭命令发送到
  • Html5 标题标签验证错误

    您好 我正在根据 html 5 验证我的源代码 但我收到此错误 现在知道如何解决它 这是错误 在此上下文中 不允许 XHTML 元素标题作为 XHTML 元素元的子元素 抑制该子树中的更多错误 有任何想法吗 在对 XML 规则严格的 XHT
  • %g 如何对浮点数进行四舍五入?

    当我使用时 g作为格式说明符printf 有时四舍五入到小数点后 2 位 有时到 3 位 有时到 4 位 它是如何做到的 实际上我们应该在哪里使用 g代替 f or e对于浮点数 The g格式说明符的舍入就像 f会做 但如果 f会导致4
  • 在 PHP 中查找仅包含特定字符集的数组元素

    我只需要查找具有一组特定字母以及该组字母之前或之后的任何字符的数组元素 我有这样的数组 sample array sten netff enet denet value array e n t 我需要从中找到值 sample数组有 e n
  • 应用程序无响应(ANR)执行服务android

    host activity 是我的包 host framework ServicePromemoria 是一个android 服务 这个错误是什么意思 这意味着您的服务正在执行相当长的操作 大多数 ANR 来自超过 5 秒的操作 并且是在
  • PHP + MYSQL 对 Duplicate KEY 仍然增加 INDEX KEY

    我的桌子有这种风格 ID EMAIL VERSION LASTUPDATE 其中 id 是自动增量并且主要 并且电子邮件是唯一的 因此 每次有人使用我的应用程序时 它都会获取用户电子邮件并尝试插入 如果电子邮件已存在 则会将该行更新为 ve
  • 自动重试 401 并使用 HttpClient 4.3 发送特定请求

    我在应用程序中使用特定的身份验证机制 登录应用程序将登录请求发送到特定的 url login 并获取存储在 cookie 中的会话令牌 服务器随时可以使令牌失效 其他请求将导致 401 我希望 HttpClient 自动检测 401 错误
  • UITableViewController 上的上边距

    我有一个 TabBarController 其中一个选项卡包含一个子视图 它是一个导航控制器 然后 我将继承 UITableViewController 的视图加载到导航控制器中 我的问题是 由于某种原因 表格视图开始位于导航控制器后面 而
  • vuejs 路由器 - 要求未定义

    我正在尝试从这个开始 https github com vuejs vue router https github com vuejs vue router 我已经克隆了该包 并按照说明进行构建 npm install npm run bu
  • 实体框架 6 中的多异步?

    这是我的代码 var banner context Banners ToListAsync var newsGroup context NewsGroups ToListAsync await Task WhenAll banner new
  • 在 Swift 4 中实现自定义解码器

    我想使用新的解码 XML 文档DecodableSwift 4 中引入的协议 但是 似乎没有符合该协议的 XML 解码器的现有实现Decoder协议 我的计划是使用 SWXMLHash 库来解析 XML 然后可能使XMLIndexer该库中