[英]Create Codable Struct with multiple child element from loop
我有一个可编码的结构,我将使用它为 API 调用生成 JSON。 元素 slide.slideData.elText 需要携带将由循环生成的多个自身实例。 虽然我可以填充 elText 的单个实例的值,但我正在努力寻找如何添加该元素的多个实例。 SlideData.elText 基本上需要是一组 elText 实例,而不仅仅是一个实例。 数据将如下所示:
循环1:内容:“循环1内容”颜色:“循环1颜色”
循环 2:内容:“循环 2 内容”颜色:“循环 2 颜色”
循环 3:内容:“循环 3 内容”颜色:“循环 3 颜色”
等等。这是当前的结构:
struct ApiSlideData: Codable {
let slide: [Slide]
struct Slide : Codable {
let id: Int
let createdById: Int
let memberId: Int
let slideTitle: String
let productType: String
let slideType: String
let slideData: [SlideData]
}
struct SlideData: Codable {
let elText: [ElText]
}
struct ElText : Codable {
let content: String
let color: String
}
}
这就是我目前填充数据的方式:
let elText = ApiSlideData.ElText(
content: "loop 1 content",
color: "loop 1 color"
)
let slideData = ApiSlideData.SlideData(
elText: [elText]
)
let slide = ApiSlideData.Slide(
id: 1,
createdById: 102,
memberId: 1,
slideTitle: "test title",
productType: "bc",
slideType: "company-profile",
slideData: [slideData]
)
let apiSlide = ApiSlideData(slide: [slide])
print("---------------------------------")
print("apiSlide: \(apiSlide)")
这导致了这个 output:
apiSlide: ApiSlideData(slide: [My_app.ApiSlideData.Slide(id: 1, createdById: 102,
memberId: 1, slideTitle: "test title", productType: "bc", slideType: "company-profile",
slideData: [My_app.ApiSlideData.SlideData(elText:
[My_app.ApiSlideData.ElText(content: "loop 1 content", color: "loop 1 color")])])])
我需要得到这样的结果:
apiSlide: ApiSlideData(slide: [My_app.ApiSlideData.Slide(id: 1, createdById: 102,
memberId: 1, slideTitle: "test title", productType: "bc", slideType: "company-profile",
slideData: [My_app.ApiSlideData.SlideData(elText:
[My_app.ApiSlideData.ElText[
(content: "loop 1 content", color: "loop 1 color"),
(content: "loop 2 content", color: "loop 2 color"),
(content: "loop 3 content", color: "loop 2 color")
]
])])])
JSON结构如下:
{
"slide": [
{
"id": 1,
"created_by_id": 102,
"member_id": 1,
"slide_title": "TITLE TEXT",
"product_type": "bc",
"slide_type": "type-text",
"slide_data": {
"el_text": [
{
"content": "TEXT CONTENT",
"color": "48a7c3",
"element_width": 220,
"element_height": 90,
"element_center_x": 97.5,
"element_center_y": 96.0,
"element_angle": 2.16,
"stack_layer": 3
},
{
"content": "TEXT CONTENT 2",
"color": "000000",
"element_width": 220,
"element_height": 90,
"element_center_x": 97.5,
"element_center_y": 96.0,
"element_angle": 2.16,
"stack_layer": 2
},
],
"el_image": [
{
"content":
"2757439c3f424a7f99fbdc04e306d150a4752e8b.png",
"element_width": 220,
"element_height": 90,
"element_center_x": 97.5,
"element_center_y": 96.0,
"element_angle": 2.16,
"stack_layer": 3
}
],
"el_shape": [
{
"type": "rect",
"color": "48a7c3",
"element_width": 220,
"element_height": 90,
"element_center_x": 97.5,
"element_center_y": 96.0,
"element_angle": 2.16,
"stack_layer": 4
}
]
}
}
]
}
这可能吗?
谢谢
使用以下结构:
struct TopLevel: Codable {
let slide: [Slide]
}
struct Slide: Codable {
let id, createdByID, memberID: Int
let slideTitle, productType, slideType: String
let slideData: SlideData
enum CodingKeys: String, CodingKey {
case id
case createdByID = "created_by_id"
case memberID = "member_id"
case slideTitle = "slide_title"
case productType = "product_type"
case slideType = "slide_type"
case slideData = "slide_data"
}
}
struct SlideData: Codable {
let elText, elImage, elShape: [El]
enum CodingKeys: String, CodingKey {
case elText = "el_text"
case elImage = "el_image"
case elShape = "el_shape"
}
}
struct El: Codable {
let content: String?
let elementWidth, elementHeight: Int
let elementCenterX, elementCenterY, elementAngle: Double
let stackLayer: Int
let type, color: String?
enum CodingKeys: String, CodingKey {
case content
case elementWidth = "element_width"
case elementHeight = "element_height"
case elementCenterX = "element_center_x"
case elementCenterY = "element_center_y"
case elementAngle = "element_angle"
case stackLayer = "stack_layer"
case type, color
}
}
并创建SlideData struct
变量,而不是遍历您的内容。
经过一番诡计多端,我设法解决了这个问题。 使用新结构添加 el_text 元素的多个实例的方式如下(代码显示了手动创建完整结构并按预期进行编码):
var elTextTest: [ApiSlideData.ElText] = []
let elText = ApiSlideData.ElText(
content: "test content",
color: "ffccff",
fontStyle: "",
fontWeight: "",
fontSize: 20,
textAlignment: "",
elementWidth: 200,
elementHeight: 100,
elementCenterX: 180,
elementCenterY: 90,
elementAngle: -0.432,
stackLayer: 1
)
let elText2 = ApiSlideData.ElText(
content: "test again",
color: "ccffcc",
fontStyle: "",
fontWeight: "",
fontSize: 20,
textAlignment: "",
elementWidth: 200,
elementHeight: 100,
elementCenterX: 180,
elementCenterY: 90,
elementAngle: -0.432,
stackLayer: 1
)
elTextTest.append(contentsOf: [elText])
elTextTest.append(contentsOf: [elText2])
let elImage = ApiSlideData.El(
content: "image-url",
elementWidth: 200,
elementHeight: 100,
elementCenterX: 180,
elementCenterY: 90,
elementAngle: -0.432,
stackLayer: 1,
type: "",
color: ""
)
let elShape = ApiSlideData.El(
content: "",
elementWidth: 200,
elementHeight: 100,
elementCenterX: 180,
elementCenterY: 90,
elementAngle: -0.432,
stackLayer: 1,
type: "rect",
color: "ffccff"
)
let slideData = ApiSlideData.SlideData(
elText: elTextTest,
elImage: [elImage],
elShape: [elShape]
)
let slide = ApiSlideData.Slide(
createdOn: "2020-03-08 20:13:11.779738+00",
updatedOn: "2020-03-08 20:13:11.779738+00",
id: 1,
createdById: 102,
memberId: 1,
slideTitle: "test title",
productType: "bc",
slideType: "type-1",
slideData: slideData
)
let apiSlide = ApiSlideData(slide: [slide])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.