Как создать структуру данных модели для объектной модели - PullRequest
0 голосов
/ 31 августа 2018

Это мой массив объектов, который мне нужно преобразовать из данных модели.

 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?
}

Но когда я печатаю эту структуру, она не похожа на мой объект массива.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Опираясь на ответ Дженни, вы можете привести свою структуру в соответствие с протоколом 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
    ] 
]

EDIT:

Кроме того, вы можете привести свою структуру в соответствие с протоколом 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 использует для отображения массивов и словарей, но концепция та же ...

0 голосов
/ 31 августа 2018

Вам следует использовать метод JSONSerialization data(withJSONObject: product) для преобразования массива словарей в данные json и использовать протокол Codable для инициализации массива объектов CartFood:

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

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

do {
    let productsData = try JSONSerialization.data(withJSONObject: product)
    let products = try JSONDecoder().decode([CartFood].self, from: productsData)
    print(products.first?.id ?? "")

    // encoding
    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted
    let jsonData = try encoder.encode(products)
    print(String(data: jsonData, encoding: .utf8)!)
} catch {
    print(error)
}

[

{

"id" : 23,

"price" : 150,

"quantity" : 10

},

{

"id" : 23,

"price" : 150,

"quantity" : 10

} * * тысяча двадцать-один

]

если вам нужно преобразовать структуру обратно в словарь, отметьте answer .

0 голосов
/ 31 августа 2018

Это ближе к тому, что вы хотите?

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)
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...