将 Decodable 与继承一起使用会引发异常

2024-03-04

我正在使用 Rest API 服务,其中响应分为基本响应,所有其他响应都继承自它。

我正在尝试使用解码器接口为我的响应模型类构建相同的结构。

但是我在继承类的解码方面遇到问题。

我试图关注这个问题:在 Swift 4 中使用 Decodable 和继承 https://stackoverflow.com/questions/44553934/using-decodable-in-swift-4-with-inheritance

但没有运气。

这是初始结构:

class LoginResponse: BaseResponse{

    var Message: String?

    private enum CodingKeys: String, CodingKey{
        case Message
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        Message = try container.decode(String.self, forKey: .Message)
        let superDecoder = try container.superDecoder()
        try super.init(from: superDecoder)
    }
}

class BaseResponse: Decodable {

    var Status: Int?

    private enum CodingKeys: String, CodingKey{
        case Status
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self) // This line throws the exception
        Status = try container.decode(Int.self, forKey: .Status)
    }
}

这是我尝试解码的方式:

 let decoder = JSONDecoder()
 let json = "{\"Message\":\"saa\",\"Status\":200}"
 let login = try! decoder.decode(LoginResponse.self, from: json.data(using: .utf8)!)

正如我上面所写,这一行抛出异常(在 BaseResponse 类中)

let container = try decoder.container(keyedBy: CodingKeys.self)


Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.valueNotFound(Swift.KeyedDecodingContainer<SampleProject.BaseResponse.(CodingKeys in _084835F8074C7E8C5E442FE2163A7A00)>, Swift.DecodingError.Context(codingPath: [Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "super", intValue: nil)], debugDescription: "Cannot get keyed decoding container -- found null value instead.", underlyingError: nil))

不知道如何处理。

提前致谢!


无需使用superDecoder,你可以简单地这样做(我将变量名称更改为小写以符合命名约定)

class LoginResponse: BaseResponse {

    let message: String

    private enum CodingKeys: String, CodingKey{
        case message = "Message"
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        message = try container.decode(String.self, forKey: .message)
        try super.init(from: decoder)
    }
}

class BaseResponse: Decodable {

    let status: Int

    private enum CodingKeys: String, CodingKey{
        case status = "Status"
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        status = try container.decode(Int.self, forKey: .status)
    }
}
  • decoder.decode(BaseResponse.self ...仅解码status
  • decoder.decode(LoginResponse.self ...解码status and message

并且永远不要用try!. 处理错误.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Decodable 与继承一起使用会引发异常 的相关文章

  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • 如何在 Swift 中获取字典中最后输入的值?

    如何获取 Swift 字典中最后输入的值 例如 我如何从下面获取值 CCC var dictionary Dictionary
  • NVActivityIndi​​catorView 仅适用于特定视图

    我正在使用这个库https github com ninjaprox NVActivityIndi catorView https github com ninjaprox NVActivityIndicatorView用于显示加载指示器
  • CGPoint 标量乘法 Swift

    我正在 SpriteKit 中构建一个平台游戏 并将为我的实体实现更新功能 以便它们根据重力和速度移动 但是 我需要使添加的速度量与增量时间成比例 以防止帧速率影响我的实体的移动方式 因此我将导入 GLKit 以便我可以使用标量函数 但是
  • 在 swrevealcontroller 之前实现登录屏幕

    我刚刚开始学习 IOS 开发 我已经按照给定的在线教程成功实现了 SWRevealViewController 一切都按预期工作 然后 我决定添加一个登录屏幕 这将是应用程序运行时用户看到的第一个页面 我采取的步骤如下 将 UIViewCo
  • 列表不符合 Encodable

    因此 我正在使用领域 并且两个模型之间有以下关系 A unit has many tests Unit model class Unit Object Decodable objc dynamic var id String let tes
  • Swift 闭包作为 AnyObject

    我尝试使用这个方法 class addMethod 在 Obj c 中使用如下 class addMethod self class selector eventHandler imp implementationWithBlock han
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • NSPredicate 的 onFormat 字符串

    我想用 id 键对数据进行排序 我如何理解格式字符串的用途NSPredicate格式 我有一个100号的帖子 我的代码 let objectIDs posts map 0 id let predicate NSPredicate forma
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector
  • 在 swift 中获取 NSImage 的 PNG 表示

    嘿 我在获取 NSImage 对象的 PNG 表示时遇到了一些问题 这就是我正在做的 var imgData NSData coverImgView image TIFFRepresentation var bitmap NSBitmapI
  • SpriteKit 碰撞检测中 SKSpriteNode 之间的间隙

    我已经尝试解决这个问题很长一段时间了 我有一个具有简单平台物理原理的游戏 其中玩家跌倒在一个方块上 这可以阻止他跌倒 这是可行的 但是玩家停止的位置和实际对象 精灵节点的位置之间存在明显的差距 这是一个屏幕截图 它应该是不言自明的 clas
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • 在 macOS 上通过 Apache 本地运行 Xcode DocC 文档

    Xcode 13 的 DocC 文档档案可以使用自定义 Apache 托管 htaccess文件中描述的向外部开发人员分发文档 https developer apple com documentation xcode distributi
  • AudioPlayer 和锁屏/控制中心控制 Swift [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我是斯威夫特的新手 我写信是因为我想问一个问题 我和我的朋友正在开发一个音频播放器 但我们遇到了问题 播放器还可以在后台

随机推荐

  • 网站的 A/B 测试是什么意思?

    请解释 举例 网站 A B 测试的含义 在网站上下文中 这意味着该网站 网络应用程序的某些用户获得slightly修改版本 并验证与基线 控制 版本相比 每个修改如何影响可用性 用户行为 与往常一样 A B 测试是一种统计技术 您需要足够大
  • 使用哪些 C# AES 加密选项以便可以在公共网站上解密结果? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用类似于下面的代码来加密字符串 并能够使用公开网站 例如其中一个网站 对其进行解密 但也对其他一些网站开放 htt
  • 用户窗体工具箱附加控件对话窗口未显示

    在使用 MS Excel 显然还有 Outlook Word 或 Power Point 时 我创建了一个用户表单 工具箱显示控件选项卡和代表各种控件的 16 个图标 当我右键单击工具箱控制区域中的某个空白区域时 会出现一个菜单 其中在顶部
  • 如何存储然后检索父子依赖性数据(Maya MEL/Python 脚本)

    我有一个需要的层次结构 分开 做一点事 按照以前的方式将其重新组装起来 我确实知道如何打破事物 并且对当层次结构扁平时我需要做什么有计划 问题是我如何养育他们 Details 这与我之前的问题有关 冻结带有动画子对象的父对象的缩放变换 MA
  • 在 Android 帐户管理器中存储其他数据

    我想使用安卓AccountManager但是 要同步我的网络服务和应用程序 联系人和日历的标准同步 AccountManager似乎只存储用户名和密码 我的 Web 服务需要三个凭据 用户名 密码和帐户 存储第三条信息的最佳实践是什么 正如
  • JPA - 事务未提交

    我正在开发一个项目 在该项目中我第一次使用 JPA Hibernate 和所有这些东西 但我遇到了事务未提交的问题 我使用类 User 如下所示 package org tomasherman JBTBackup Resource Enti
  • 通过正则表达式限制文本中的行数

    在任何编程语言中 我都知道如何有效地限制给定文件或字符串中的行数 这不是这里的问题 然而在这种情况下 我希望通过正则表达式来做到这一点 在这个模式中我只使用 n 换行符 我不需要其他人 例如 r 回车 n n 0 3 上面的正则表达式解释如
  • 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

    我拼凑了下面的代码 它没有做任何复杂的事情 只是创建一个 byte 变量 将其写入 Cassandra 中的 blob 字段 v1 2 通过新的 Datastax CQL 库 然后将其读回又出来了 当我把它放进去时 它是 3 个元素长 当我
  • @AspectJ 类级别注释建议,以注释作为方法参数

    如何获取注释作为定义的建议的参数传递 类级注释 是否可以 来自帖子here https stackoverflow com questions 2011089 aspectj pointcut for all methods of a cl
  • 如何将 COM 对象包装在本机 .NET 类中?

    我在 NET C 中使用广泛的现有 COM API 可能是 Outlook 但事实并非如此 我通过在 Visual Studio 中添加 COM 引用 来完成此操作 因此所有 魔法 都是在幕后完成的 即 我不必手动运行tlbimp 虽然现在
  • 是否可以在不重新加载页面的情况下检查用户是否在 php 中启用了 cookie?

    例如 即使实际设置了 cookie 下面的代码似乎也不起作用 直到我刷新页面 setcookie cookies 1 time 86400 if isset COOKIE cookies cookies foobar 我试图在我的网站上编写
  • 用户关闭应用程序后,如何恢复上次查看的活动?

    用户关闭应用程序后 我如何恢复上次查看的活动 就像 如果用户打开应用程序 第一个活动将出现 当用户单击按钮时 它将继续到下一个活动 如果他关闭应用程序并再次打开 它仍然会显示上次查看的活动 我该怎么做 请帮我 谢谢你 我认为你应该使用共享首
  • 在 iOS 上使用 PhoneGap/Cordova 和外部 URL

    我希望我的phonegap cordova 应用程序加载外部页面 而不加载任何本地页面 现在我这样做了 但是我的插件 javascript 不起作用 因为它们是从本地index html调用的 在这种情况下我该怎么办 我应该将插件放在外部
  • JPA EntityManager:merge() 正在尝试在数据库中创建新行 - 为什么?

    我通过 Play Framework 使用 JPA 我正在检查 User 对象是否被缓存 如果是 我检索它并 merge 它 以便我可以更新字段并稍后保存更改 user User Cache get user auth sessionAut
  • Intellisense 无法识别 python 3 的类型提示

    我想使用 Visual Studio 并使用类型提示 例如在函数参数列表中 查看智能感知 以确定变量的类型 这可以通过以下方式实现isinstance param type 声明 但我想知道我们是否可以在没有这些附加声明的情况下让它工作 注
  • 阻止 Ninject 自动绑定 Func

    我有一个优先级队列 它采用函数作为构造函数参数 public PriorityQueue ISomeOtherInjectedThing other Func
  • Camel是否为每条路线创建一个线程

    最近我开始使用camel 我发现它有可能满足我的许多集成层需求 我创建了一个 java 客户端应用程序 不在任何容器中运行 其中定义了两条路由 路线 1 将文件从传入文件夹 1 移动到文件夹 2 路线2 将文件内容从folderx移动到mq
  • 如何使用多项 Logit 模型的标准误差获得平均边际效应 (AME)?

    我想要获得具有标准误差的多项 Logit 模型的平均边际效应 AME 为此我尝试了不同的方法 但到目前为止还没有达到目标 最好的尝试 我最好的尝试是使用手动获取 AMEmlogit我在下面展示了这一点 library mlogit ml d
  • 如何在swift 4中的webview中显示大量数据

    在我的一个应用程序中 我必须在 Web 视图中显示来自 Web 服务响应的 html 内容 如果html数据较小 那么它将显示在webview中 但是 当 html 内容非常重时 在 Web 视图应用程序中显示的时间就会很长 我做了一件事只
  • 将 Decodable 与继承一起使用会引发异常

    我正在使用 Rest API 服务 其中响应分为基本响应 所有其他响应都继承自它 我正在尝试使用解码器接口为我的响应模型类构建相同的结构 但是我在继承类的解码方面遇到问题 我试图关注这个问题 在 Swift 4 中使用 Decodable