我的应用从API端点获取数据。
数据是一个Review,模型如下所示:
struct Review: Identifiable, Decodable {
var id: Int
var reviewable_type: String
var score: Int?
var reviewable: <THIS CAN BE A MOVIE, A SHOW OR AN EPISODE>
var user: User
var created_at: String?
var created: String?
var text: String?
}
正如您所看到的,reviewable
属性可以有多种类型。我该如何实现这一点?我有不同的数据模型为电影,显示和插曲。注意:reviewable_type保存reviewable
变量中的类型值。我不知道这有没有帮助。
我尝试了协议和扩展,但似乎无法让它工作。
2条答案
按热度按时间2j4z5cfb1#
你可以做的是将structReview转换成一个关联类型的协议,也就是另一个协议Reviewable。
该协议必须至少符合Decodable协议,但也可以包含所有内容之间的公共属性,例如ID。
结构体Review如下转换:
然后,您将为每种类型的可查看内容创建一个结构体:
每个Review Type对应一个struct。
然后它们都可以在类型为any Review的数据结构中使用。下面是一个简单的例子:
vfhzx4xs2#
我喜欢AntonioWar's answer,如果对象都有相同的字段,而它们没有。也许它仍然以这种方式工作,但从他的回答中我不清楚。
我解决这个问题的方法是:我创建了一个
Reviewable
结构体,其中包含Show
、Episode
和Movie
结构体中的所有字段:然后,我在
Review
结构体中添加了以下类型:然后,我为3个
Reviewable
对象创建了扩展,并使用一个函数将Reviewable
转换为Movie
,Episode
或Show
:因为我从
Review
上的reviewable_type
变量知道它是哪种类型,所以我可以使用它将其解码为正确的结构:也许这是一个非常破旧的方式来做,但这是什么为我工作(也许其他人可以使用它)。