【发布时间】: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