Вопрос или проблема
Я разрабатываю приложение с использованием SwiftData
и CloudKit
, которое предлагает пользователю выбрать из List
жанров фильмов, заполняемого из enum
и другого массива объектов (больше об этом через секунду):
enum MovieGenre: String, Codable, CaseIterable
{
case drama = "Драма"
case comedy = "Комедия"
case action = "Экшен"
case horror = "Ужасы"
case thriller = "Триллер"
case musical = "Мюзикл"
case animated = "Анимация"
}
В этом List
есть Button
, который позволяет пользователю добавлять свой собственный жанр, для этого у меня есть класс model
CustomMovieGenre
:
import Foundation
import SwiftData
@Model
class CustomMovieGenre
{
var name: String = ""
init(name: String)
{
self.name = name
}
}
Когда пользователь добавляет CustomMovieGenre
, он будет добавлен в List
жанров фильмов. Поскольку я хочу, чтобы элемент MovieGenre
хранил другие постоянные данные модели (например, массивы фильмов в этом жанре и т.д.), я думаю о том, чтобы избавиться от enum
и объединить CustomMovieGenre
и MovieGenre
в один класс с названием MovieGenre
(это также упростит код для отображения List
).
Поскольку я все еще хочу иметь стандартные жанры, мне интересно, существует ли общий шаблон для достижения этого или есть ли более умный способ? На данный момент, когда приложение запускается, я думаю, мне нужно проверить, существуют ли стандартные MovieGenre
, и если нет, создать их. Мне не очень нравится делать это, и я думаю, есть ли способ получше. Спасибо!
Ответ или решение
Для разработки приложения, использующего SwiftData и CloudKit, которое позволяет пользователям выбирать жанры фильмов из списка, можно рассмотреть подход, который объединяет ваши предустановленные жанры и пользовательские жанры в одну сущность. Таким образом, вы сможете как хранить предопределенные значения, так и позволять пользователям добавлять свои собственные жанры.
Шаги для реализации
- Создание единого класса для хранения жанров фильма:
Вместо разделения на перечисление (enum) для предустановленных жанров и отдельный класс для пользовательских жанров, создайте единственный класс MovieGenre
, который будет содержать как предустановленные, так и пользовательские жанры:
import Foundation
import SwiftData
@Model
class MovieGenre {
var id: UUID
var name: String
var isDefault: Bool
init(name: String, isDefault: Bool = false) {
self.id = UUID()
self.name = name
self.isDefault = isDefault
}
}
- Инициализация предустановленных жанров:
При запуске приложения вы можете проверить наличие предустановленных жанров в базе данных. Если они отсутствуют, создайте их. Это можно сделать в методе AppDelegate
или в SceneDelegate
, в зависимости от структуры вашего приложения:
func initializeDefaultGenres() {
let defaultGenres = [
"Drama",
"Comedy",
"Action",
"Horror",
"Thriller",
"Musical",
"Animated"
]
for genreName in defaultGenres {
let genre = MovieGenre(name: genreName, isDefault: true)
saveToDatabase(genre) // функция для сохранения жанра в бд
}
}
- Добавление пользовательских жанров:
Когда пользователь добавляет собственный жанр, создайте экземпляр MovieGenre
с isDefault
установленным в false
. Это будет сигнализировать о том, что жанр был добавлен пользователем:
func addCustomGenre(name: String) {
let customGenre = MovieGenre(name: name, isDefault: false)
saveToDatabase(customGenre) // функция для сохранения жанра в бд
}
- Отображение списка жанров:
При отображении списка жанров можно объединить предустановленные и пользовательские жанры. Например:
func fetchAllGenres() -> [MovieGenre] {
var allGenres = fetchFromDatabase() // функция для получения всех жанров из бд
// Здесь можно добавить дополнительные действия, если это необходимо.
return allGenres
}
Заключение
Объединение предопределенных и пользовательских жанров в одну модель MovieGenre
упростит архитектуру вашего кода и сделает его более управляемым. Инициализация предустановленных жанров в базе данных при первом запуске приложения позволит избежать дублирования кода и упростит дальнейшие изменения и дополнения.
Эта структура позволит вам легко управлять любыми функциями, связанными с жанрами фильмов, включая добавление и удаление, что сделает ваше приложение более гибким и удобным для пользователя.