繁体   English   中英

从循环中创建具有多个子元素的可编码结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM