Сохранение данных с объектами, которые могут иметь предопределенные значения по умолчанию и значения, созданные пользователем.

Вопрос или проблема

Я разрабатываю приложение с использованием 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, которое позволяет пользователям выбирать жанры фильмов из списка, можно рассмотреть подход, который объединяет ваши предустановленные жанры и пользовательские жанры в одну сущность. Таким образом, вы сможете как хранить предопределенные значения, так и позволять пользователям добавлять свои собственные жанры.

Шаги для реализации

  1. Создание единого класса для хранения жанров фильма:

Вместо разделения на перечисление (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
    }
}
  1. Инициализация предустановленных жанров:

При запуске приложения вы можете проверить наличие предустановленных жанров в базе данных. Если они отсутствуют, создайте их. Это можно сделать в методе 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) // функция для сохранения жанра в бд
    }
}
  1. Добавление пользовательских жанров:

Когда пользователь добавляет собственный жанр, создайте экземпляр MovieGenre с isDefault установленным в false. Это будет сигнализировать о том, что жанр был добавлен пользователем:

func addCustomGenre(name: String) {
    let customGenre = MovieGenre(name: name, isDefault: false)
    saveToDatabase(customGenre) // функция для сохранения жанра в бд
}
  1. Отображение списка жанров:

При отображении списка жанров можно объединить предустановленные и пользовательские жанры. Например:

func fetchAllGenres() -> [MovieGenre] {
    var allGenres = fetchFromDatabase() // функция для получения всех жанров из бд
    // Здесь можно добавить дополнительные действия, если это необходимо.
    return allGenres
}

Заключение

Объединение предопределенных и пользовательских жанров в одну модель MovieGenre упростит архитектуру вашего кода и сделает его более управляемым. Инициализация предустановленных жанров в базе данных при первом запуске приложения позволит избежать дублирования кода и упростит дальнейшие изменения и дополнения.

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

Оцените материал
Добавить комментарий

Капча загружается...