Swift 使用结构的数据模型(通常是值类型)-如何保持所有内容的同步?

Swift 使用结构的数据模型(通常是值类型)-如何保持所有内容的同步?,swift,struct,Swift,Struct,我希望这个问题不要过于笼统或宽泛。但在过去的一周里,我一直在努力掌握这个概念,但我没有取得任何进展。我已经阅读了几十篇关于StackOverflow的文章和答案,但似乎没有人正确地解决这个问题。每个人都在使用最基本的模型,这些模型一点也不纠结(参见示例)。可能是我太傻了 我真的很难理解一个好的数据模型是如何工作的,以及如何在应用程序中实现它。我想要一个在整个应用程序中一致且方便的方法。我有一个例子 假设我想创建一个如下的数据模型: struct-Person{ 变量名称:String } 结构车

我希望这个问题不要过于笼统或宽泛。但在过去的一周里,我一直在努力掌握这个概念,但我没有取得任何进展。我已经阅读了几十篇关于StackOverflow的文章和答案,但似乎没有人正确地解决这个问题。每个人都在使用最基本的模型,这些模型一点也不纠结(参见示例)。可能是我太傻了

我真的很难理解一个好的数据模型是如何工作的,以及如何在应用程序中实现它。我想要一个在整个应用程序中一致且方便的方法。我有一个例子

假设我想创建一个如下的数据模型:

struct-Person{
变量名称:String
}
结构车{
变量名称:String
var owner:Person//链接到汽车结构
}
结构车库{
cars:[Car]//Car结构数组。用法:可能是显示所有汽车的列表视图
}
这涵盖了我在使用
structs
作为数据模型时遇到的一些大问题:

  • 模型之间的引用-结构是值类型,引用另一个模型只会创建该模型的副本。因此,我最终得到了相同数据的多个副本。如果数据发生变化怎么办?或者,如果引用本身发生变化(即车主),该怎么办?例如,使用苹果的
    Combine
    框架观察
    Car
    结构并不能真正起作用,因为这是
    owner
    引用,而且它只是原始
    Person
    的副本

  • 模型阵列-这似乎更加棘手。我必须决定是将数组作为一个整体使用(即,对于列表视图),还是需要使用单个元素(即,将汽车传递到详图视图)。当我试图保持所有东西的同步时,似乎我必须从两个选项中选择一个。同时做这两件事看起来是不可能的。我可以创建两个单独的模型,每个模型都有自己的用例,但同样,我最终得到了相同数据的多个副本。它就是不起作用

    (更清楚地说:我的意思是我总是要在
    观察([cars])
    [Observe(car)]
    之间做出决定。两者都做似乎不起作用。)

我如何在具有多个视图(如“CarListView”、“CarDetailView”、“PersonDetailView”)的项目中使用此数据模型,而不会得到几十个完全不同的数据副本?

我真的很想使用
structs
,因为代码变得如此简单和漂亮。但这似乎真的很烦人,而且部分是不可能的。然而,在大多数情况下,无论我走到哪里,人们都建议使用
structs
而不是
classes
。这个例子看起来像是一个相当基本和正常的用例。它不适合
struct
使用吗?我只是愚蠢吗


我非常感谢您对这个话题的任何见解。这让我发疯。

使用核心数据。它可以顺利处理所有关系。然而,核心数据是基于类的。正如瓦迪安所说,使用核心数据或其他数据库引擎来存储数据。您拥有的模型结构很好,但存储在属性中的数据很短,并且存储在内存中。你不应该有一个内存中的模型,它可以从各种地方得到更新。从数据库加载模型,做你需要做的并保存更改,在需要的地方重复。是的,我完全同意。我最初开始考虑这一点的原因是我想创建独立和分离的代码。这个想法是让你可以插入任何东西(比如CoreData),但它可以自己工作。这感觉像是“正确”的方式。也许这个假设很愚蠢?在我过去的项目中,我使用领域作为数据库,我发现对于小项目来说,使用核心数据要容易得多(轻量级)。至于您的观察者,它确实提供了
NotificationToken
,允许您观察对象、查询等的更改。使用核心数据。它可以顺利处理所有关系。然而,核心数据是基于类的。正如瓦迪安所说,使用核心数据或其他数据库引擎来存储数据。您拥有的模型结构很好,但存储在属性中的数据很短,并且存储在内存中。你不应该有一个内存中的模型,它可以从各种地方得到更新。从数据库加载模型,做你需要做的并保存更改,在需要的地方重复。是的,我完全同意。我最初开始考虑这一点的原因是我想创建独立和分离的代码。这个想法是让你可以插入任何东西(比如CoreData),但它可以自己工作。这感觉像是“正确”的方式。也许这个假设很愚蠢?在我过去的项目中,我使用领域作为数据库,我发现对于小项目来说,使用核心数据要容易得多(轻量级)。至于您的观察者,它确实提供了
NotificationToken
,允许您观察对象、查询等方面的更改。