From eef2addb8714bd901928e1a4e100b694dc9bf60b Mon Sep 17 00:00:00 2001 From: DenAlNik Date: Tue, 21 May 2024 13:30:29 +0300 Subject: [PATCH 1/6] delete change theme in settings --- LiveRecipes/Modules/Recipes/FiltersView.swift | 2 +- .../Modules/Recipes/KeyWordsView.swift | 143 +----------------- .../Modules/Settings/SettingsView.swift | 16 -- .../Modules/Settings/SettingsViewModel.swift | 15 +- 4 files changed, 3 insertions(+), 173 deletions(-) diff --git a/LiveRecipes/Modules/Recipes/FiltersView.swift b/LiveRecipes/Modules/Recipes/FiltersView.swift index a744e43..7e319cd 100644 --- a/LiveRecipes/Modules/Recipes/FiltersView.swift +++ b/LiveRecipes/Modules/Recipes/FiltersView.swift @@ -24,7 +24,7 @@ struct FiltersView: View { Image(systemName: "xmark") .imageScale(.small) .fontWeight(.semibold) - .foregroundStyle(Color(red: 0.2353, green: 0.2353, blue: 0.2627, opacity: 0.6)) + .foregroundStyle(Color(red: 0.2353, green: 0.2353, blue: 0.2627, opacity: 1)) } .frame(width: 30, height: 30) .background(Color(UIColor.secondarySystemBackground)) diff --git a/LiveRecipes/Modules/Recipes/KeyWordsView.swift b/LiveRecipes/Modules/Recipes/KeyWordsView.swift index 9b11a91..49b1399 100644 --- a/LiveRecipes/Modules/Recipes/KeyWordsView.swift +++ b/LiveRecipes/Modules/Recipes/KeyWordsView.swift @@ -7,84 +7,6 @@ import SwiftUI -//struct KeyWordsView: View { -// @Environment(\.presentationMode) var presentationMode -// @StateObject var viewModel: RecipesViewModel -// @State private var searchText = "" -// -// var body: some View { -// NavigationView { -// keyWordsViewContent() -// .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always)) -// .navigationTitle("keywords.title".localized) -// .navigationBarTitleDisplayMode(.inline) -// .toolbar { -// ToolbarItem(placement: .topBarTrailing) { -// Button { -// self.presentationMode.wrappedValue.dismiss() -// viewModel.sortKeyWordsByChoose() -// } label: { -// VStack { -// Image(systemName: "xmark") -// .imageScale(.small) -// .fontWeight(.semibold) -// .foregroundStyle(Color(red: 0.2353, green: 0.2353, blue: 0.2627, opacity: 0.6)) -// } -// .frame(width: 30, height: 30) -// .background(Color(UIColor.secondarySystemBackground)) -// .clipShape(.circle) -// } -// } -// } -// } -// } -// -// @ViewBuilder -// func keyWordsViewContent() -> some View { -// if (viewModel.keyWords.isEmpty) { -// Text("keywords.error.message".localized) -// } else { -// ScrollView { -// LazyVGrid(columns: [GridItem(), GridItem(), GridItem()], -// content: { -// ForEach (viewModel.keyWords.indices, id: \.self) { index in -// VStack { -// Button(action: { -// viewModel.keyWords[index].choose() -// }, label: { -// Text(viewModel.keyWords[index].keyWord) -// .tint(viewModel.keyWords[index].isChoosed ? .white : .black) -// .font(.caption) -// .padding(8) -// .background(Color(viewModel.keyWords[index].isChoosed ? UIColor.orange : UIColor.secondarySystemBackground)) -// .clipShape(.capsule) -// }) -// } -// } -// }) -// } -// .overlay( -// Button { -// self.presentationMode.wrappedValue.dismiss() -// viewModel.sortKeyWordsByChoose() -// } label: { -// HStack { -// Image(systemName: "magnifyingglass") -// .imageScale(.medium) -// Text("keywords.search.button".localized) -// } -// .tint(.white) -// .fontWeight(.semibold) -// } -// .frame(width: 200, height: 50) -// .background(.orange, in: .rect(cornerRadius: 14)), -// alignment: .bottom -// ) -// } -// } -//} - - struct KeyWordsView: View { @Environment(\.presentationMode) var presentationMode @@ -107,7 +29,7 @@ struct KeyWordsView: View { Image(systemName: "xmark") .imageScale(.small) .fontWeight(.semibold) - .foregroundStyle(Color(red: 0.2353, green: 0.2353, blue: 0.2627, opacity: 0.6)) + .foregroundStyle(Color(red: 0.2353, green: 0.2353, blue: 0.2627, opacity: 1)) } .frame(width: 30, height: 30) .background(Color(UIColor.secondarySystemBackground)) @@ -165,66 +87,3 @@ struct KeyWordsView: View { } } } - - -//пытался сделать нормально, не через LazyVGrid - -// LazyVStack { -// GeometryReader { proxy in -// var width = UIScreen.main.bounds.size.width -// var height = UIScreen.main.bounds.size.height -// ZStack(alignment: .topLeading) { -// ForEach (viewModel.keyWords.indices, id: \.self) { index in -// VStack { -// Button(action: { -// viewModel.keyWords[index].choose() -// }, label: { -// Text(viewModel.keyWords[index].keyWord) -// .tint(viewModel.keyWords[index].isChoosed ? .white : .black) -// .font(.caption) -// .padding(8) -// .background(Color(viewModel.keyWords[index].isChoosed ? UIColor.orange : UIColor.secondarySystemBackground)) -// .clipShape(.capsule) -// }) -// .padding(4) -// } -// .alignmentGuide(.top, computeValue: {d in -// let result = height -// if index == viewModel.keyWords.endIndex { -// height = 0 -// } -// return result -// }) -// .alignmentGuide(.leading, computeValue: { d in -// if (abs(width - d.width) > proxy.size.width - 24) -// { -// width = 0 -// height -= d.height -// } -// let result = width -// if index == viewModel.keyWords.endIndex { -// width = 0 -// } else { -// width -= d.width -// } -// return result -// }) -// -// .padding(.horizontal, 8) -// } -// } -// } -// } -// } -// .scrollIndicators(.hidden) -// } -// } -// -// private func viewHeightReader(_ binding: Binding) -> some View { -// return GeometryReader { geometry -> Color in -// let rect = geometry.frame(in: .local) -// DispatchQueue.main.async { -// binding.wrappedValue = rect.size.height -// } -// return .clear -// } diff --git a/LiveRecipes/Modules/Settings/SettingsView.swift b/LiveRecipes/Modules/Settings/SettingsView.swift index 3a963d4..ab5a17b 100644 --- a/LiveRecipes/Modules/Settings/SettingsView.swift +++ b/LiveRecipes/Modules/Settings/SettingsView.swift @@ -16,22 +16,6 @@ struct SettingsView: View { var body: some View { List { - Section { - Picker(selection: $viewState.selectedSegment, label: Text("Select a segment")) { - ForEach(0.. Date: Tue, 21 May 2024 13:39:37 +0300 Subject: [PATCH 2/6] fix error in filters clear --- LiveRecipes/Modules/Recipes/FiltersView.swift | 11 +++++++---- LiveRecipes/Modules/Recipes/RecipesViewModel.swift | 3 --- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/LiveRecipes/Modules/Recipes/FiltersView.swift b/LiveRecipes/Modules/Recipes/FiltersView.swift index 7e319cd..5cd61cb 100644 --- a/LiveRecipes/Modules/Recipes/FiltersView.swift +++ b/LiveRecipes/Modules/Recipes/FiltersView.swift @@ -35,6 +35,9 @@ struct FiltersView: View { Button { viewModel.duration = "" viewModel.calories = "" + viewModel.protein = "" + viewModel.fats = "" + viewModel.carbohydrates = "" viewModel.contains = [] viewModel.notContains = [] viewModel.findRecipesByFilter() @@ -74,7 +77,7 @@ struct FiltersView: View { TextField("num".localized, text: $viewModel.calories) .padding(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0)) .keyboardType(.numberPad) - .background(RoundedRectangle(cornerRadius: 8).fill(.background)) + .background(RoundedRectangle(cornerRadius: 8).fill(.windowBackground)) .multilineTextAlignment(.center) .frame(width: 90) } @@ -98,7 +101,7 @@ struct FiltersView: View { TextField("num".localized, text: $viewModel.protein) .padding(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0)) .keyboardType(.numberPad) - .background(RoundedRectangle(cornerRadius: 8).fill(.background)) + .background(RoundedRectangle(cornerRadius: 8).fill(.windowBackground)) .multilineTextAlignment(.center) .frame(width: 90) } @@ -122,7 +125,7 @@ struct FiltersView: View { TextField("num".localized, text: $viewModel.fats) .padding(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0)) .keyboardType(.numberPad) - .background(RoundedRectangle(cornerRadius: 8).fill(.background)) + .background(RoundedRectangle(cornerRadius: 8).fill(.windowBackground)) .multilineTextAlignment(.center) .frame(width: 90) } @@ -146,7 +149,7 @@ struct FiltersView: View { TextField("num".localized, text: $viewModel.carbohydrates) .padding(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0)) .keyboardType(.numberPad) - .background(RoundedRectangle(cornerRadius: 8).fill(.background)) + .background(RoundedRectangle(cornerRadius: 8).fill(.windowBackground)) .multilineTextAlignment(.center) .frame(width: 90) } diff --git a/LiveRecipes/Modules/Recipes/RecipesViewModel.swift b/LiveRecipes/Modules/Recipes/RecipesViewModel.swift index ff39ccf..f71ebbd 100644 --- a/LiveRecipes/Modules/Recipes/RecipesViewModel.swift +++ b/LiveRecipes/Modules/Recipes/RecipesViewModel.swift @@ -314,14 +314,12 @@ final class RecipesViewModel: ObservableObject, RecipesViewModelProtocol { nutritionValue: Nutrition(bzy: result.bzy), dishComposition: dishComposition, dishSteps: dishSteps)) { - print("success") self?.showRecipesInDB()////////////////////////////////////////////// } } } func deleteFromCoreDataFavorites(recipe: RecipePreviewDTO) { coreData.delete(recipeNetId: recipe.id) {[weak self] _ in - print("sucksess") self?.showRecipesInDB()////////////////////////////////////////////////// } } @@ -341,7 +339,6 @@ final class RecipesViewModel: ObservableObject, RecipesViewModelProtocol { } coreData.delete(recipeMyId: recipe.id) { [weak self] _ in - print("sucksess") self?.showRecipesInDB() } } From d0e5984dde42da9f82f0d584426a02d235000e95 Mon Sep 17 00:00:00 2001 From: DenAlNik Date: Tue, 21 May 2024 14:11:08 +0300 Subject: [PATCH 3/6] final fixes --- LiveRecipes/Localizable.xcstrings | 3 +++ .../AnimatedElements/BlinkingText + TimerView.swift | 2 +- .../AnimatedElements/IngredientRunningTextView.swift | 2 +- .../Cooking/Components/OneStep/OneStepView.swift | 2 +- LiveRecipes/Modules/Settings/SettingsView.swift | 10 +++++++++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/LiveRecipes/Localizable.xcstrings b/LiveRecipes/Localizable.xcstrings index b33068e..e81b3ec 100644 --- a/LiveRecipes/Localizable.xcstrings +++ b/LiveRecipes/Localizable.xcstrings @@ -2967,6 +2967,9 @@ }, "Очистить мои рецепты?" : { + }, + "Очистить недавние?" : { + }, "Первое блюдо" : { "extractionState" : "manual", diff --git a/LiveRecipes/Modules/Cooking/AnimatedElements/BlinkingText + TimerView.swift b/LiveRecipes/Modules/Cooking/AnimatedElements/BlinkingText + TimerView.swift index 55ca90e..93d0d08 100644 --- a/LiveRecipes/Modules/Cooking/AnimatedElements/BlinkingText + TimerView.swift +++ b/LiveRecipes/Modules/Cooking/AnimatedElements/BlinkingText + TimerView.swift @@ -238,7 +238,7 @@ struct TimerView: View { } else { Text(hours == 0 ? "\(minutes)m:\(seconds)s" : "\(hours)h:\(minutes)m:\(seconds)s") - .foregroundColor(Color(uiColor: .label)) + .foregroundColor(Color(uiColor: .black)) .font(.system(size: 19, weight: .semibold)) .padding(.top, 2) diff --git a/LiveRecipes/Modules/Cooking/AnimatedElements/IngredientRunningTextView.swift b/LiveRecipes/Modules/Cooking/AnimatedElements/IngredientRunningTextView.swift index 3eff7ce..0c7da7f 100644 --- a/LiveRecipes/Modules/Cooking/AnimatedElements/IngredientRunningTextView.swift +++ b/LiveRecipes/Modules/Cooking/AnimatedElements/IngredientRunningTextView.swift @@ -82,7 +82,7 @@ struct IngredientRunningTextView2: View { .background(.white) .clipShape(RoundedRectangle(cornerRadius: 20)) .font(.system(size: 18, weight: .regular)) - .foregroundColor(Color(uiColor: .label)) + .foregroundColor(Color(uiColor: .black)) .offset(x: computedFinishX, y: 0) Spacer() } diff --git a/LiveRecipes/Modules/Cooking/Components/OneStep/OneStepView.swift b/LiveRecipes/Modules/Cooking/Components/OneStep/OneStepView.swift index d19062f..e265b03 100644 --- a/LiveRecipes/Modules/Cooking/Components/OneStep/OneStepView.swift +++ b/LiveRecipes/Modules/Cooking/Components/OneStep/OneStepView.swift @@ -115,7 +115,7 @@ struct OneStepView: View { Spacer() } }.buttonStyle(.borderedProminent) - .tint(Color(uiColor: .label)) + .tint(Color(uiColor: .black)) .padding(.bottom, 20) .frame(width: UIScreen.main.bounds.width - 20) .offset(y: model.isTimerOnView ? 10 : -100) diff --git a/LiveRecipes/Modules/Settings/SettingsView.swift b/LiveRecipes/Modules/Settings/SettingsView.swift index ab5a17b..3bac014 100644 --- a/LiveRecipes/Modules/Settings/SettingsView.swift +++ b/LiveRecipes/Modules/Settings/SettingsView.swift @@ -13,6 +13,7 @@ struct SettingsView: View { @StateObject var creationViewModel = CreationViewModel(creationModel: CreationModel()) @State var isClearMyRecipes = false @State var isClearFavorites = false + @State var isClearRecents = false var body: some View { List { @@ -57,11 +58,18 @@ struct SettingsView: View { // .tint(Color(uiColor: .label)) // } Button(action: { - viewState.clearRecents() + isClearRecents = true }) { Text("settings.clearRecents".localized) .tint(Color(uiColor: .label)) + }.alert(isPresented: $isClearRecents) { + Alert(title: Text("Очистить недавние?"), primaryButton: .default(Text("Да")){ + viewState.clearRecents() + isClearFavorites = false + }, secondaryButton: .default(Text("Отмена")) { + isClearFavorites = false + }) } NavigationLink(destination: CreationView(viewState: creationViewModel), isActive: $isShowingCreationView, label: { Text("settings.publishMyRecipe".localized) From 3407f44fda32ef0adb515704c09336da62ee0528 Mon Sep 17 00:00:00 2001 From: DenAlNik Date: Tue, 21 May 2024 14:19:57 +0300 Subject: [PATCH 4/6] updated my view on main --- LiveRecipes/Modules/Recipes/RecipesView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LiveRecipes/Modules/Recipes/RecipesView.swift b/LiveRecipes/Modules/Recipes/RecipesView.swift index 4e0179f..4e30a43 100644 --- a/LiveRecipes/Modules/Recipes/RecipesView.swift +++ b/LiveRecipes/Modules/Recipes/RecipesView.swift @@ -293,7 +293,7 @@ struct RecipesView: View { .font(.caption2) .multilineTextAlignment(.center) } - .frame(width: 220, height: 100) + .frame(width: 220, height: 170) .background(Color(UIColor.secondarySystemBackground)) .clipShape(.rect(cornerRadius: 8)) .padding(.bottom, 12) From 70679efa8734e5e0dd4d18bb4414d23ecfd5fc11 Mon Sep 17 00:00:00 2001 From: DenAlNik Date: Tue, 21 May 2024 14:45:37 +0300 Subject: [PATCH 5/6] loading recents when appears --- LiveRecipes.xcodeproj/project.pbxproj | 14 ++++----- LiveRecipes/Modules/Recipes/RecipesView.swift | 4 +++ .../Modules/Recipes/RecipesViewModel.swift | 31 ++++++++++++------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/LiveRecipes.xcodeproj/project.pbxproj b/LiveRecipes.xcodeproj/project.pbxproj index c6ca155..7b9e902 100644 --- a/LiveRecipes.xcodeproj/project.pbxproj +++ b/LiveRecipes.xcodeproj/project.pbxproj @@ -948,7 +948,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5PM42AC732; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TimerActivityWidget/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = TimerActivityWidget; @@ -960,7 +960,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipes.TimerActivityWidget; + PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipesq.TimerActivityWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -976,7 +976,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5PM42AC732; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TimerActivityWidget/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = TimerActivityWidget; @@ -988,7 +988,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipes.TimerActivityWidget; + PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipesq.TimerActivityWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1127,7 +1127,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LiveRecipes/Preview Content\""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5PM42AC732; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = LiveRecipes/Info.plist; @@ -1143,7 +1143,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipes; + PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipesq; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "LiveRecipes/LiveRecipes-Bridging-Header.h"; @@ -1180,7 +1180,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipes; + PRODUCT_BUNDLE_IDENTIFIER = ru.LiveRecipesq; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "LiveRecipes/LiveRecipes-Bridging-Header.h"; diff --git a/LiveRecipes/Modules/Recipes/RecipesView.swift b/LiveRecipes/Modules/Recipes/RecipesView.swift index 4e30a43..398344b 100644 --- a/LiveRecipes/Modules/Recipes/RecipesView.swift +++ b/LiveRecipes/Modules/Recipes/RecipesView.swift @@ -23,6 +23,10 @@ struct RecipesView: View { allRecipesView() cookToTimeView() recentRecipesView() + .onAppear { + viewModel.isLoadingRecents = true + viewModel.loadRecents() + } myRecipesView() } else { diff --git a/LiveRecipes/Modules/Recipes/RecipesViewModel.swift b/LiveRecipes/Modules/Recipes/RecipesViewModel.swift index f71ebbd..e0a98d6 100644 --- a/LiveRecipes/Modules/Recipes/RecipesViewModel.swift +++ b/LiveRecipes/Modules/Recipes/RecipesViewModel.swift @@ -61,7 +61,8 @@ final class RecipesViewModel: ObservableObject, RecipesViewModelProtocol { //для сохраненных @Published var favoritesID: [Int] = [] - + @Published var recentsID: [Int] = [] + //отслеживание загрузки @Published var isLoading: Bool = true @Published var isLoading1: Bool = true @@ -183,19 +184,25 @@ final class RecipesViewModel: ObservableObject, RecipesViewModelProtocol { } func loadRecents() { - recentRecipes = [] - let arrayOfRecentsID = UserDefaults.standard.array(forKey: "recentsID") as? [Int] ?? [] - if arrayOfRecentsID.isEmpty { - isLoadingRecents = false - return - } - for id in arrayOfRecentsID { - model.findRecipe(id: id) { [weak self] result in - self?.recentRecipes.append(result) - DispatchQueue.main.async { - self?.isLoadingRecents = false + isLoadingRecents = true + let tempid = recentsID + recentsID = UserDefaults.standard.array(forKey: "recentsID") as? [Int] ?? [] + if tempid != recentsID { + recentRecipes = [] + if recentsID.isEmpty { + isLoadingRecents = false + return + } + for id in recentsID { + model.findRecipe(id: id) { [weak self] result in + self?.recentRecipes.append(result) + DispatchQueue.main.async { + self?.isLoadingRecents = false + } } } + } else { + isLoadingRecents = false } } From c16f376334c7e39cad7bc6de3dfbbd69adf3bb74 Mon Sep 17 00:00:00 2001 From: DenAlNik Date: Tue, 21 May 2024 15:07:06 +0300 Subject: [PATCH 6/6] keywords --- LiveRecipes/Modules/Recipes/RecipesModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LiveRecipes/Modules/Recipes/RecipesModel.swift b/LiveRecipes/Modules/Recipes/RecipesModel.swift index a9c35c5..45fd1d9 100644 --- a/LiveRecipes/Modules/Recipes/RecipesModel.swift +++ b/LiveRecipes/Modules/Recipes/RecipesModel.swift @@ -116,7 +116,7 @@ final class RecipesModel: ObservableObject, RecipesModelProtocol { return [ KeyWord(keyWord: "Суп"), KeyWord(keyWord: "Завтрак"), KeyWord(keyWord: "Салат"), KeyWord(keyWord: "Вкус"), KeyWord(keyWord: "Быстрое"), KeyWord(keyWord: "Дессерт"), KeyWord(keyWord: "Секрет"), KeyWord(keyWord: "Тесто"), KeyWord(keyWord: "Форма"), KeyWord(keyWord: "Сахар"), KeyWord(keyWord: "Сладкое"), KeyWord(keyWord: "Традиционное"), KeyWord(keyWord: "Легкий"), KeyWord(keyWord: "Диета"), KeyWord(keyWord: "Пудинг"), KeyWord(keyWord: "Сироп"), - KeyWord(keyWord: "Фрукт") + KeyWord(keyWord: "Фрукт"), KeyWord(keyWord: "Мексиканское"), KeyWord(keyWord: "Фрукты"), KeyWord(keyWord: "Нежный"), KeyWord(keyWord: "Утотченный"), KeyWord(keyWord: "Сладкая"), KeyWord(keyWord: "Карамель"), KeyWord(keyWord: "Мучное"), KeyWord(keyWord: "Английское"), KeyWord(keyWord: "Второе блюдо"), KeyWord(keyWord: "Полезное"), KeyWord(keyWord: "Легкое"), KeyWord(keyWord: "Вечер"),KeyWord(keyWord: "Ужин"), KeyWord(keyWord: "Обед"), KeyWord(keyWord: "Драники"), KeyWord(keyWord: "Сырники"), KeyWord(keyWord: "Итальянское"), KeyWord(keyWord: "Огонь"), KeyWord(keyWord: "Отдых"), KeyWord(keyWord: "Простое"), KeyWord(keyWord: "Постное"), KeyWord(keyWord: "Постный"), KeyWord(keyWord: "Лист"), KeyWord(keyWord: "Духовка"),KeyWord(keyWord: "В духовке") , KeyWord(keyWord: "Крепкое"), KeyWord(keyWord: "Крепкий"), KeyWord(keyWord: "Мука"), KeyWord(keyWord: "Сода"), KeyWord(keyWord: "Без молока"), KeyWord(keyWord: "Алкоголь") ] } }