【问题标题】:What is the most appropriate way to initialise an enum from some JSON data in Swift?从 Swift 中的一些 JSON 数据初始化枚举的最合适方法是什么?
【发布时间】:2020-11-29 02:43:22
【问题描述】:

我想从一些 JSON 数据初始化一个 Shape 枚举,但我觉得我这样做的方式可能会遇到错误,我想知道是否有一种更安全或更标准的方法来初始化一些枚举JSON。

我拥有的 JSON 数据的 sn-p 如下所示:

"foo": [
        {
            "name": "bar",
            "enemyShape": "triangle",
        },

我可以通过Codable struct like this 访问数据:

struct Enemy: Codable { //data about all the pegs
    
    let name: String
    private let enemyShape: String
    
    public var shape: Shape {
        return Shape(enemyShape)
    }
    
}

我初始化枚举Shape(enemyShape)的代码如下:

enum Shape: CaseIterable {
    case triangle
    case square
    case pentagon
    
    
    init(_ str: String) {
        switch str {
            case "triangle":
                self = .triangle
            case "square":
                self = .square
            case "pentagon":
                self = .pentagon
            default:
                self = .triangle
                print("Shape initiated with invalid value \(str). Defaulted to triangle.")
        }
    }
}

我担心这样做不安全或不正确 - 特别是因为 default: 下的代码永远不会执行,但必须用于编译代码。

有没有更好的方法从 JSON 中获取枚举器?我只需要一些字符串,例如"triangle" 来初始化.triangle"square".square 等。

编辑:请注意,当我不直接从 JSON 数据初始化此枚举时,这就是为什么我认为它与 this 问题不同。我还希望能够在代码中的任何位置从“类似”字符串初始化枚举,而不必在该时间点使用任何 JSON 数据。

我可以随时用enter link description here的方法初始化这种方式,所以我接受了他的回答。

【问题讨论】:

  • this 回答你的问题了吗?
  • 这能回答你的问题吗? How do I make an enum Decodable in swift 4?
  • @Sweeper 谢谢你的链接——这些信息在未来会有用,但我认为它不能直接回答我的问题。我还希望能够在代码中的任何位置从“类似”字符串初始化枚举,而不必在该时间点使用任何 JSON 数据。 jawadAli 的回答允许我在任何时候从一个字符串初始化,无论我是否使用它,所以我接受了他的回答。
  • @JoakimDanielson 同上 - 我不能同时@两个人,对不起!

标签: json swift enums swift5 codable


【解决方案1】:

你可以像这样直接使用枚举

enum Shape:String, Codable, CaseIterable {
    case triangle = "triangle" 
    case square = "square" 
    case pentagon = "pentagon"
}

【讨论】:

  • 这就是我想要的,只是我必须写Shape(rawValue: "square")。这不是什么大问题,但是否有可能摆脱初始化程序中的rawValue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多