Модель данных в Swift с несколькими переменными, основанными друг на друге - PullRequest
0 голосов
/ 12 марта 2019

В настоящее время я застрял в ситуации, когда мне нужно создать модель данных, которая будет использоваться в UITableView для добавления постов и их извлечения (читай: показывать их в ленте). Позвольте мне объяснить:

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

struct Post {
    var Title: String
    var Body: String
    var Tags: [String]
}

Это прекрасно работает. Я могу повторно использовать это для создания нескольких сообщений одновременно в UITableView, что именно то, что я хочу. Однако проблема возникает сейчас, когда я хочу улучшить свою систему. Я хочу, чтобы пользователи могли добавлять вложения, будь то изображения или видео (давайте оставим это в этих двух для этого примера и оставим текстовые документы, pdfs, ...). Моя UITableView настроена таким образом, что каждый раздел - это сообщение, а каждая строка - это элемент этого сообщения. Заголовок определяется в UITextField в заголовке раздела, а теги - в нижнем колонтитуле раздела. Тело это ряд. Теперь я хочу разрешить пользователям добавлять строки, чтобы добавлять все, что они хотят: простой текст (строка «тело»), а также изображения (и) или видео (ы). Я создам три кнопки: Добавить текст, Добавить изображение и Добавить видео.

Как я могу улучшить свою модель данных, чтобы она могла хранить всю эту информацию? Должен ли я, например, добавить одну переменную «Вложения» для всех типов (изображение и видео) или создать отдельные необязательные переменные, например:

struct Post {
    var postTitle: String
    var postBody: String
    var postTags: [String]
    var postImages: [AttachmentImage]
    var postVideos: [AttachmentVideo]
}

struct AttachmentImage {
    var imageTitle: String
    var imageReference: String
    var imageSize: Int
}

struct AttachmentVideo {
    var videoTitle: String
    var videoReference: String
    var videoSize: Int
    var videoThumbnail: String
}

Это кажется возможным, но я хотел бы добиться определенного способа, чтобы я мог изменять переменные на основе другой переменной. В идеале у меня было бы что-то вроде:

enum PostTypes {
    case Text, Image, Video
}

struct Post {
    var postTitle: String
    var postBody: String
    var postTags: [String]
    var postType: PostTypes
}

И затем, если типом является Текст, я хочу сохранить его как есть, но если типом является Изображение, я хочу добавить imageTitle, imageReference и imageSize, и то же самое для Видео. Есть ли способ достичь этого, или я должен пойти с дополнительными?

1 Ответ

0 голосов
/ 12 марта 2019

Первый как первый: если у вас есть модель с именем Post, вам не нужно называть ее свойства такими, как postTitle, postBody и т. Д. ... title или body достаточно.


Вы можете определить протокол для своих структур, а затем добавить общее ограничение для Post struct

protocol Attachment {
    var title: String { get set }
    var reference: String { get set }
    var size: Int { get set }
}

struct Post<T: Attachment> {
    var title: String
    var body: String
    var tags: [String]
    var attachments: [T]
}

struct AttachmentImage: Attachment {
    var title: String
    var reference: String
    var size: Int
}

struct AttachmentVideo: Attachment {
    var title: String
    var reference: String
    var size: Int
    var thumbnail: String
}

Пример использования:

let post = Post(title: "", body: "", tags: [], attachments: [AttachmentImage(title: "", reference: "", size: 1)])
post.attachments /* type: [AttachmentImage] */

let post = Post(title: "", body: "", tags: [], attachments: [AttachmentVideo(title: "", reference: "", size: 1, thumbnail: "")])
post.attachments /* type: [AttachmentVideo] */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...