Я хочу знать, является ли мой способ структурирования данных лучшим или нет. Причина, по которой я задавался этим вопросом, связана со сложными требованиями, которые мне нужны от данных.
Я пытаюсь проверить, соответствует ли список ингредиентов users списку ингредиентов recipes, и иметь возможность отображать и подсчитывать их. Например:
Количество ингредиентов
1/2 ingredients
Пользователь
Dough
У пользователя нет
Mozzarella
Структура данных для моего рецепта в настоящее время выглядит так:
{
"RecipeData": {
"-KlKMkBekJ6plrXI5cZV": {
"name": "Pizza",
"ingredients": {
"-KkY8kL_wvxrcqMn_aP_": true,
"-KkbS1pYW_9l4y4HPuog": true
}
}
}
}
Подробная информация об ингредиентах, т.е. название, взята из словаря:
{
"IngredientData": {
"ingredients": {
"-KkbS1pYW_9l4y4HPuog": {
"name": "Dough"
},
"-KkY8kL_wvxrcqMn_aP_": {
"name": "Mozzarella"
}
}
}
}
Вот как это выглядит, когда пользователь добавляет свои ингредиенты:
{
"users": {
"Ss5XNpWJ5IfIuYiMqsxTnMgjNrm1": {
"usersList": {
"-KlKuq2xjbQcR3ZMsHF1": {
"name": "Dough"
}
}
}
}
}
С этой структурой данных мне было трудно сравнивать значения списка ингредиентов пользователей со списком ингредиентов рецепта.
Обновление:
У меня есть класс Ingredient
, который обрабатывает свойства внутри пользовательских ингредиентов, я также использую его при получении названий ингредиентов внутри рецепта:
class Ingredient {
var name: String?
var key: String?
init(from snapshot: FIRDataSnapshot) {
let snapshotValue = snapshot.value as? [String: Any]
self.key = snapshot.key
self.ref = snapshot.ref
self.name = snapshotValue?["name"] as? String
}
У меня также есть IngredientManager
, в котором есть набор ингредиентов, и я могу вызвать его куда угодно.
У меня есть класс Recipe
, который обрабатывает свойства внутри рецепта:
class Recipe {
var name: String!
var ingredients = [String]()
var key: String
init(from snapshot: FIRDataSnapshot) {
let snapshotValue = snapshot.value as! [String: Any]
self.name = snapshotValue["name"] as? String
self.key = snapshot.key
recipeIng(snapshot: snapshot.childSnapshot(forPath: "ingredients"))
}
// Function to count the number of ingredients inside recipe... this works
func recipeIng(snapshot: FIRDataSnapshot) {
for item in snapshot.children {
guard let ing = item as? FIRDataSnapshot else { continue }
// Gets the key and turns it into a string and then appends it to the array.
guard let value = ing.key as? String else { return }
ingredients.append(value)
}
}
// Function to match the ingredients.
func matchedIngredients() -> ([String], [String]) {
var userHas = [String]()
var userHasNot = [String]()
// loops through the users ingredients
for ingedient in IngredientManager.shared.ingredients {
// loops through the recipe's ingredients
for i in ingredients {
if ingedient.name == r {
userHas.append(i)
} else {
userHasNot.append(i)
}
}
}
return (userHas, userHasNot)
}
}
Я могу подсчитать количество ингредиентов в рецепте, но сейчас я изо всех сил пытаюсь сравнить это со списком ингредиентов users. ingredient.name
может получить название ингредиентов users, которые я хотел бы использовать для сравнения, поскольку ключ для ингредиентов users полностью отличается от рецепты.
Вот как я отображаю это на этикетке:
ingredientLbl.text = "\(recipe.matchedIngredients().0.count)/\(recipe.ingredients.count)"