初始化期间可编码的默认值

Posted

技术标签:

【中文标题】初始化期间可编码的默认值【英文标题】:Codable default values during initialization 【发布时间】:2020-04-19 19:34:30 【问题描述】:

我是 Swift 的新手,我正在为我的项目研究功能标志概念,但我一直坚持使用可编码作为默认标志值。目前我的代码看起来像这样

import Foundation 

class KillSwitches: Codable 

    public enum CodingKeys: String, CodingKeys 
        case featureOne
        case featureTwo
        case featureThree
    

    let featureOne: Bool = true
    let featureTwo: Bool = true
    let featureThree: Bool = false

我有内部帮助类,可以帮助对 json 文件中的所有值进行编码和解码,这就是为什么这里没有明确提到它的原因。在此实现之前,我没有任何默认值,而是使用 struct 从远程配置文件中读取所有内容,该文件运行良好。现在,如果远程配置文件无法访问,我将在下一步中为我的功能设置默认值。

我期待我可以初始化这个类,所以我会得到一个具有默认值的类的对象,就像我从远程文件中读取时得到的一样。

如果不传递 init(来自解码器:),我无法实例化此类。我什至试过做

KillSwitches.init(from: KillSwitches.self) 也不起作用,我得到 Type 不符合预期的解码器类型。

我的 Json 看起来像这样


  "featureOne" : false,
  "featureTwo" : true,
  "featureThree" : true

非常感谢任何解决此问题的指导/指针。

【问题讨论】:

【参考方案1】:

一旦你符合Encodable,就好像你的类已经显式声明了一个encode(to:)方法和一个init(from:)初始化器。

通过声明带有参数的初始化程序,当所有属性都具有默认值时,您会立即丢失编译器为您生成的默认(无参数)初始化程序。这就是为什么你不能做KillSwitches()。这在documentation 中有说明:

Swift 为任何结构或类提供默认初始化器 为其所有属性提供默认值并且不提供 至少一个初始化器本身。默认初始化器只是 创建一个新实例,并将其所有属性设置为默认值 价值观。

KillSwitches 已经有一个 init(from:) 初始化器,因此 Swift 不提供默认初始化器。

你只需要自己添加无参数初始化器:

class KillSwitches: Codable 

    public enum CodingKeys: String, CodingKey 
        case featureOne
        case featureTwo
        case featureThree
    

    let featureOne: Bool = true
    let featureTwo: Bool = true
    let featureThree: Bool = false

    init()  

然后你可以这样做:

let defaultKillSwitches = KillSwitches()

如果你想要默认值。

【讨论】:

我多么愚蠢。感谢您指出这一点,它完美无缺。 !!! Sweeper,即使我使用 JSONDecoder() 再次创建具有新值的模型,它总是返回默认值,你能帮忙吗?我最初会获得模型值作为默认值,但是一旦我有了新值,那么它的值应该被替换并获得具有新值的模型。 @pradipsutariya 您的问题需要比您提供的更多信息才能回答,例如minimal reproducible example 等等。我建议您将其作为一个单独的问题发布。

以上是关于初始化期间可编码的默认值的主要内容,如果未能解决你的问题,请参考以下文章

MIRO 界面税码的默认值逻辑

用不同的参数和默认值在 Ruby 中初始化类的最有效方法是啥?

如何在 Acumatica 中获取交易期间和财务期间的默认值

Django 在迁移期间要求默认值

在准备命令期间覆盖 Maven 依赖项解析的默认值

SQL - 选择具有默认值的期间的数据