Swift中的数据模型,具有基于彼此的多个变量

问题描述 投票:0回答:1

我目前陷入困境,我需要创建一个数据模型,将在UITableView中用于添加帖子和检索它们(阅读:在Feed中显示它们)。请允许我解释一下:

我想为帖子创建一个标准数据模型,其中包含标题,正文和标签。我为此使用了一个结构。

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

这非常有效。我可以重新使用它在UITableView中同时创建多个帖子,这正是我想要的。但是,当我想改进我的系统时,问题就出现了。我想允许用户添加附件,无论是图像还是视频(让我们将其保留在这两个示例中,并省略文本文档,pdf,...)。我的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,以及相同的视频。有没有办法实现这一目标,还是应该选择选项?

ios swift data-modeling
1个回答
0
投票

首先是第一个:如果你有名为Post的模型,你不必像postTitlepostBody等那样命名它的属性...... titlebody就足够了。


您可以为结构定义协议,然后可以为Post结构添加通用约束

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] */
© www.soinside.com 2019 - 2024. All rights reserved.