【问题标题】:How to create a model data struct for object model如何为对象模型创建模型数据结构
【发布时间】:2019-02-06 12:09:22
【问题描述】:

这是我必须从模型数据转换的对象数组。

 let Product =  [
        [
            "id" : 23,
            "price" : 150,
            "quantity" : 10
        ],
        [
            "id" : 23,
            "price" : 150,
            "quantity" : 10
        ]
    ]

我是这样尝试的:

struct cartFood{
    var id: Int?
    var price: Int?
    var quantity: Int?
}

但是当我打印这个结构时,它看起来不像我的数组对象。

【问题讨论】:

  • 它是字符串数组的数组
  • 是的.. 这是字符串数组
  • 不清楚你在问什么。您发布的第一个代码块创建了一个字典数组。第二个代码块定义了一个结构,但没有创建该结构的实例。
  • 实际上我希望如果我打印这个结构,它看起来就像我得到的对象数据.. 我不知道该怎么做
  • “这是我必须从模型数据转换的对象数组”和“给定我的对象数据”是什么意思?您如何获得对象数据?在 JSON 中?您是说希望数据以您在问题顶部发布的格式显示?

标签: swift data-modeling


【解决方案1】:

基于 Jenny 的回答,您可以使您的结构符合 CustomStringConvertible 协议,并为 description 添加计算属性:

struct CartFood: CustomStringConvertible {
    var id: Int
    var price: Int
    var quantity: Int
    var description: String {
        return """
            [
                "id": \(id),
                "price": \(price),
                "quantity": \(quantity)
            ]
        """
    }
}

let products = [
    CartFood(id: 23, price: 150, quantity: 10),
    CartFood(id: 23, price: 150, quantity: 10)
]
print("[\n",products.map {$0.description}.joined(separator: ",\n"), "\n]")

输出:

[
     [
        "id": 23,
        "price": 150,
        "quantity": 10
    ],
    [
        "id": 23,
        "price": 150,
        "quantity": 10
    ] 
]

编辑:

或者,您可以使您的结构符合Codable 协议:

struct CartFood: Codable {
    var id: Int
    var price: Int
    var quantity: Int
}

这意味着它可以轻松地转换为 JSON。

然后你可以为 Encodable 协议创建一个简单的扩展,让你可以将任何 Encodable 对象显示为“漂亮”的 JSON 字符串:

extension Encodable {
    var prettyJSON: String {
        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        guard let data = try? encoder.encode(self),
            let output = String(data: data, encoding: .utf8)
            else { return "Error converting \(self) to JSON string" }
        return output
    }
}

并像这样显示你的结构数组:

 let products = [
    CartFood(id: 23, price: 150, quantity: 10),
    CartFood(id: 23, price: 150, quantity: 10)
]

print("products.prettyJSON =", products.prettyJSON)

输出:

products.prettyJSON = [
  {
    "id" : 23,
    "price" : 150,
    "quantity" : 10
  },
  {
    "id" : 23,
    "price" : 150,
    "quantity" : 10
  }
]

这使用 JSON 语法而不是 Apple 用于显示数组和字典的语法,但概念是一样的...

【讨论】:

  • 我的回答是基于 OP 的评论“实际上我希望如果我打印这个结构,它看起来就像我得到的对象数据”。我提供了代码,让您可以打印 CartFood 结构数组并获取原始问题中显示的格式。
  • 顺便说一句let products = [(23,150,10),(23,150,10)].map(CartFood.init)
  • 可爱的技巧,但我更喜欢命名参数而不是初始化程序。你的版本太神秘了。
  • @LeoDabus 是什么让这合法?结构体的初始化程序通常需要命名参数,那么如何将元组数组映射到CartFood 结构体数组?
  • kkk 我不知道它是如何工作的,但我认为你需要它来匹配元素的数量及其类型
【解决方案2】:

这更接近你想要的吗?

struct CartFood {
    var id: Int
    var price: Int
    var quantity: Int
}

let products = [
    CartFood(id: 23, price: 150, quantity: 10),
    CartFood(id: 23, price: 150, quantity: 10)
]

【讨论】:

  • 实际上我希望如果我打印这个结构,它看起来就像我得到的对象数据
  • @behtito 你需要让它符合 Encodable
  • 如果我打印这个.. 它看起来像 [FoodaFood.cartFood(id: Optional(23), price: Optional(150), quantity: Optional(10)), FoodaFood.cartFood(id:可选(23),价格:可选(150),数量:可选(10))]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2018-07-20
  • 2020-12-24
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多