从 Swift 中的某些 JSON 数据初始化枚举的最合适方法是什么?
What is the most appropriate way to initialise an enum from some JSON data in Swift?
我想从一些JSON数据中初始化一个Shape
枚举,但我觉得我这样做的方式可能会遇到错误,我想知道是否有更安全或更安全的方法从一些 JSON.
初始化枚举的标准方法
我的 JSON 数据片段如下所示:
"foo": [
{
"name": "bar",
"enemyShape": "triangle",
},
我可以通过 Codable
结构 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 数据初始化此枚举时,这就是为什么我认为它不同于 题。我还希望能够在代码中的任何一点从 'similar' 字符串初始化一个枚举,而不必在那个时间点使用任何 JSON 数据。
我可以随时用enter link description here的方法这样初始化,所以我接受了他的回答。
你可以像这样直接使用enum
enum Shape:String, Codable, CaseIterable {
case triangle = "triangle"
case square = "square"
case pentagon = "pentagon"
}
我想从一些JSON数据中初始化一个Shape
枚举,但我觉得我这样做的方式可能会遇到错误,我想知道是否有更安全或更安全的方法从一些 JSON.
我的 JSON 数据片段如下所示:
"foo": [
{
"name": "bar",
"enemyShape": "triangle",
},
我可以通过 Codable
结构 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 数据初始化此枚举时,这就是为什么我认为它不同于
我可以随时用enter link description here的方法这样初始化,所以我接受了他的回答。
你可以像这样直接使用enum
enum Shape:String, Codable, CaseIterable {
case triangle = "triangle"
case square = "square"
case pentagon = "pentagon"
}