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

标签 swift codable

我是 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 文件中的所有值进行编码和解码,这就是为什么这里没有明确提及它的原因。在此实现之前,我没有任何默认值,并且使用结构从远程配置文件中读取所有内容,该文件工作正常。现在,如果远程配置文件无法访问,我将在下一步中为我的功能设置默认值。

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

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

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

我的 Json 看起来像这样

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

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

最佳答案

一旦您符合 Encodable,就好像您的类已显式声明 encode(to:) 方法和 init(from:)初始化程序。

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

Swift provides a default initializer for any structure or class that provides default values for all of its properties and does not provide at least one initializer itself. The default initializer simply creates a new instance with all of its properties set to their default values.

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()

如果您想要默认值。

关于swift - 初始化期间可编码的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59541267/

相关文章:

iOS如何获取tableview单元格中整行的宽度

swift - RealityKit 应用程序和较低的 iOS 部署目标

swift - 如何使 NSAttributedString 可编码兼容?

Swift 4 可在具有枚举属性的协议(protocol)中编码

ios - 解雇两个 Controller swift

ios - 使用自定义 UICollectionViewLayout 的 UICollectionView 中的部分标题

swift - 无法使用 Swift Codable 解析响应

swift - 对成员 'decode(_:forKey:)' swift4 的模糊引用

swift - Codable:通过索引将 JSONArray 解码为特定字段

ios - 如何使用 ‘done’ 按钮 Swift 4 隐藏键盘