如何在可编码结构中使用计算属性(swift)

2024-02-23

我创建了一个“可编码”结构来序列化数据集并将其编码为 Json。除了计算属性未显示在 json 字符串中之外,一切都运行良好。如何在编码阶段包含计算属性。

Ex:

struct SolidObject:Codable{

    var height:Double                      = 0
    var width:Double                       = 0
    var length:Double                      = 0

    var volume:Double {
        get{
            return height * width * length
        }
    }
}

var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0

let jsonEncoder = JSONEncoder()
do {
    let jsonData = try jsonEncoder.encode(solidObject)
    let jsonString = String(data: jsonData, encoding: .utf8)!
    print(jsonString)
} catch {
    print(error)
}

打印出 "{"width":7.29999999999999998,"length":5,"height":10.199999999999999}"

我也很好奇有 7.29999.. 而不是 7.3,但我的主要问题是“我怎样才能将“volume”也包含到这个 json 字符串中”?


您需要手动编码/解码,而不是让自动化的东西为您做这件事。这在 Swift 游乐场中按预期工作。

struct SolidObject: Codable {

    var height:Double                      = 0
    var width:Double                       = 0
    var length:Double                      = 0

    var volume:Double {
        get{
            return height * width * length
        }
    }

    enum CodingKeys: String, CodingKey {
        case height
        case width
        case length

        case volume
    }

    init() { }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        height = try values.decode(Double.self, forKey: .height)
        width = try values.decode(Double.self, forKey: .width)
        length = try values.decode(Double.self, forKey: .length)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(height, forKey: .height)
        try container.encode(width, forKey: .width)
        try container.encode(length, forKey: .length)

        try container.encode(volume, forKey: .volume)
    }

}

var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0

let jsonEncoder = JSONEncoder()
do {
    let jsonData = try jsonEncoder.encode(solidObject)
    let jsonString = String(data: jsonData, encoding: .utf8)!
    print(jsonString)
} catch {
    print(error)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在可编码结构中使用计算属性(swift) 的相关文章

随机推荐

  • Angular2访问嵌套JSON

    我是 Typescript 中 Angular 2 的新手 我想使用 NgFor 访问 JSON 的 D 和 G 有没有办法访问元素 A B C D E F G H 我还创建了一个 Plunker Plunker https plnkr c
  • 如何从Mac到Linux交叉编译?

    我用 Rust 写了一个小游戏 然后用了cargo build release在 Mac 上编译发行版本 我尝试与使用 Ubuntu 的朋友分享此内容 但当他尝试运行二进制文件时 出现以下错误 cannot execute binary f
  • 如何判断下拉菜单是否有可供选择的选项?

    如何判断下拉菜单是否有可供选择的选项 var menu getElementById select id if menu options length has children else empty
  • 如何使用 JAXB 和 spring-boot 将 XML 转换为字符串?

    当我运行mvn spring boot run在包含 pom xml 文件的文件夹上 应用程序启动并将 POJO 正确序列化为 XML 但是当我通过转到目标文件夹并使用以下命令启动它时java jar在我得到的jar文件中javax xml
  • SCRIPT87:参数无效

    我有一个 jquery 函数 可以在所有浏览器中运行 但不能在兼容模式下的 ie7 和 ie 9 中运行 问题出在这个函数中 non attivo live click function clearInterval start slide
  • Servlet 3.1 - 安全约束 - 没有 web.xml

    Java Servlet 3 0 和 3 1 规范允许开发人员在 Java 代码中执行许多常见的基于配置的任务 而不是通过提供 web xml 文件的传统机制 我的应用程序已经完成了所有这些工作 但是在寻求解决应用程序安全性时 我找不到任何
  • React+Jest - 测试异步组件并等待安装

    我正在尝试测试一个具有异步功能的 React 组件componentDidMount Promise 本身不需要被嘲笑 它不一定用于访问外部内容 主要只是 props 的包装 但是 为了测试它 我需要使用wrapper update 4 t
  • 在 C++ 中将序列化的 Thrift 结构序列化到 Kafka

    我有一套structs定义于Thrift例如以下内容 struct Foo 1 i32 a 2 i64 b 我需要执行以下操作C a 序列化实例Foo转换为 Thrift 兼容字节 使用Binary or Compact节俭协议 b 将字节
  • Objective C 中的 INT32U 和 INT8U

    我在声明下方遇到错误 当声明 INT32U 时 我得到 错误 Though INT32U和 int 是 4 个字节 我如何声明 INT8U 的等价物 我不能使用 int 这里作为它的INT8U是2个字节 INT32U C Uucode IN
  • JavaScript - 动态创建 SVG 并修改光标

    假设我有一个 HTML5 画布 在本例中使用 Fabric js 并且我想更改画布上的光标以表示已选择的画笔大小和颜色 我认为应该有一种方法可以通过使用 JS 动态更改 SVG 的属性 大小和颜色 来做到这一点 这样我们就不必使用多个图像
  • React Native热重载刷新但不更新更改

    我了解 React 的基础知识 并在 React 上完成了一些个人项目 现在我开始反应本机 https facebook github io react native 所以我创建了一个新项目并运行run android命令 它完成了所有必需
  • 隐藏 UITabBarController 中的顶部栏

    如何使用 OBJ C 代码 不使用 Interface Builder 隐藏 UITabBarController 中的顶部栏 请参阅下面链接中的图片以更好地了解我的要求 http skitch com jugsvn dxkr7 iphon
  • 如何对 MIME 消息中 Content-Disposition 标头的文件名参数值进行编码?

    通过查看一些邮件的来源 我发现很多邮件都使用了 Encoded Words RFC 2047 https www ietf org rfc rfc2047 txt 格式对文件名参数值进行编码 然而 根据 RFC 2047 这种编码方法不应用
  • Facebook SDK 是否使用 IDFA 进行移动应用程序安装?

    当您集成 Facebook SDK 来跟踪移动应用程序安装时 这是否使用 IDFA 因此您是否必须回答yes提交应用程序供审核时 iTunes Connect 问题中的相应问题 这是代码中的application didFinishLaun
  • 组件宽度属性发生意外变化

    我注意到运行下面列出的程序有时会产生不需要的效果 编辑 我简化了代码以使事情看起来更清晰 我正在绘制一个字符串 它打印出当前组件的大小 我重写了 Component 类中的 getPrefferedSize 方法 并将宽度和高度分别设置为
  • Clojure 打印函数:pr 与 print

    有什么区别pr prn and print println 什么时候会使用其中一个而不是另一个 它们在以下方面有所不同 print println生产供人类消费的产出 pr prn产生读者可以阅读的输出 因此 在为人类生成输出时使用前一个函
  • Mailgun:使用解析云代码发送图像

    我有一个代码定义为 Parse Cloud define mailgunSendMail function request response var Mailgun require mailgun Mailgun initialize ph
  • 如何重定向到 root - public/index.html?

    我希望重定向到我的 application public 文件夹中的index html def get current user current user current user if current user nil redirect
  • jQuery animate() 和浏览器性能

    我有一些元素在页面上移动得非常缓慢 本质上 我在 40 秒左右的时间内减少了两个图像的左边距 从视觉上看 它的工作效果非常好 然而 在动画播放过程中 我的处理器使用率跃升至 50 左右 这也不特定于任何单一浏览器 Safari3 和 Fir
  • 如何在可编码结构中使用计算属性(swift)

    我创建了一个 可编码 结构来序列化数据集并将其编码为 Json 除了计算属性未显示在 json 字符串中之外 一切都运行良好 如何在编码阶段包含计算属性 Ex struct SolidObject Codable var height Do