Преобразовать массив объектов [Drink] в объект json для быстрого сохранения в базе данных Firebase? - PullRequest
0 голосов
/ 12 марта 2020

Цель: у меня есть массив [Drink] и wi sh, чтобы сохранить их в Firebase RDBS под их posId. Таким образом, сохраненная древовидная структура Firebase будет выглядеть примерно так:

-drinks
-----posID-1
--------name
--------description
--------unitPrice
--------tags
-----------tag1
-----------tag2

Класс модели Drink

class Drink {

    var posId: String?
    var name: String?
    var description: String?
    var tags: [String]?
    var unitPrice: String?

    init(dictionary: [String: Any]) {


        self.posId = dictionary["posId"] as? String
        self.name = dictionary["name"] as? String
        self.description = dictionary["description"] as? String
        self.unitPrice = dictionary["unitPrice"] as? String
        self.tags = dictionary["tags"] as? [String]


    }//end init

}//end class

функция, которая отображает массив [Drink] в Dictionary и печатает вывод на консоль

func loadDrinks(){

            print("drinksOrder count:\(drinksOrder.count)")

            let drinksOrdered = Dictionary(uniqueKeysWithValues: drinksOrder.map {($0.posId, $0.self)})
            print(drinksOrdered)

 }//end func

вывод:

[Необязательно ("0009372"): vipeeps.Drink, Необязательно ("0009373"): vipeeps.Drink, Необязательно ("0009374 "): vipeeps.Drink]

Вопрос: Как дополнительно сопоставить объект Drink с ключом словаря: структура значений, необходимая для сохранения в Firebase?

1 Ответ

1 голос
/ 12 марта 2020

Если вам нужно преобразовать его в JSON, как говорится в заголовке вопроса, вы можете использовать протокол Codable (или typealias для Decodable & Encodable. Это действительно упрощает преобразование между моделями). и json и обратно.

Вот пример модульного теста для демонстрации обоих способов. Я переключил его на структуру, просто чтобы получить бесплатный init, чтобы сделать его короче, а Equatable не требуется, только добавлен выполнить сравнение во втором модульном тесте.

import XCTest

struct Drink: Codable, Equatable {
    var posId: String?
    var name: String?
    var description: String?
    var tags: [String]?
    var unitPrice: String?
}

class CodableDrink: XCTestCase {
    func testCreateJSONFromDrink() {
        let drink = Drink(posId: "1", name: "Monster", description: "Nasty Energy Drink", tags: ["energy", "caffeine"], unitPrice: "$1.89")
        let encoder = JSONEncoder()
        let encodedData = try! encoder.encode(drink)
        let jsonString = String(data: encodedData, encoding: .utf8)!
        XCTAssertEqual(jsonString, """
        {"tags":["energy","caffeine"],"unitPrice":"$1.89","name":"Monster","posId":"1","description":"Nasty Energy Drink"}
        """)
    }
    func testCreateDrinkFromJSON() {
        let json = """
        {"tags":["energy","caffeine"],"unitPrice":"$1.89","name":"Monster","posId":"1","description":"Nasty Energy Drink"}
        """
        let decoder = JSONDecoder()
        let drink = try! decoder.decode(Drink.self, from: json.data(using: .utf8)!)
        XCTAssertEqual(drink, Drink(posId: "1", name: "Monster", description: "Nasty Energy Drink", tags: ["energy", "caffeine"], unitPrice: "$1.89"))
    }
}

Эта документация также очень полезна и показывает, как выполнять дополнительные действия, такие как обработка, когда вам нужно имя переменной и ключ в json будет отличаться или как вручную кодировать и декодировать вместо использования автоматического поведения c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...