Swift 使用结构的数据模型(通常是值类型)-如何保持所有内容的同步?
我希望这个问题不要过于笼统或宽泛。但在过去的一周里,我一直在努力掌握这个概念,但我没有取得任何进展。我已经阅读了几十篇关于StackOverflow的文章和答案,但似乎没有人正确地解决这个问题。每个人都在使用最基本的模型,这些模型一点也不纠结(参见示例)。可能是我太傻了 我真的很难理解一个好的数据模型是如何工作的,以及如何在应用程序中实现它。我想要一个在整个应用程序中一致且方便的方法。我有一个例子 假设我想创建一个如下的数据模型:Swift 使用结构的数据模型(通常是值类型)-如何保持所有内容的同步?,swift,struct,Swift,Struct,我希望这个问题不要过于笼统或宽泛。但在过去的一周里,我一直在努力掌握这个概念,但我没有取得任何进展。我已经阅读了几十篇关于StackOverflow的文章和答案,但似乎没有人正确地解决这个问题。每个人都在使用最基本的模型,这些模型一点也不纠结(参见示例)。可能是我太傻了 我真的很难理解一个好的数据模型是如何工作的,以及如何在应用程序中实现它。我想要一个在整个应用程序中一致且方便的方法。我有一个例子 假设我想创建一个如下的数据模型: struct-Person{ 变量名称:String } 结构车
struct-Person{
变量名称:String
}
结构车{
变量名称:String
var owner:Person//链接到汽车结构
}
结构车库{
cars:[Car]//Car结构数组。用法:可能是显示所有汽车的列表视图
}
这涵盖了我在使用structs
作为数据模型时遇到的一些大问题:
- 模型之间的引用-结构是值类型,引用另一个模型只会创建该模型的副本。因此,我最终得到了相同数据的多个副本。如果数据发生变化怎么办?或者,如果引用本身发生变化(即车主),该怎么办?例如,使用苹果的
框架观察Combine
结构并不能真正起作用,因为这是Car
引用,而且它只是原始owner
的副本Person
- 模型阵列-这似乎更加棘手。我必须决定是将数组作为一个整体使用(即,对于列表视图),还是需要使用单个元素(即,将汽车传递到详图视图)。当我试图保持所有东西的同步时,似乎我必须从两个选项中选择一个。同时做这两件事看起来是不可能的。我可以创建两个单独的模型,每个模型都有自己的用例,但同样,我最终得到了相同数据的多个副本。它就是不起作用
(更清楚地说:我的意思是我总是要在
和观察([cars])
之间做出决定。两者都做似乎不起作用。)[Observe(car)]
structs
,因为代码变得如此简单和漂亮。但这似乎真的很烦人,而且部分是不可能的。然而,在大多数情况下,无论我走到哪里,人们都建议使用structs
而不是classes
。这个例子看起来像是一个相当基本和正常的用例。它不适合struct
使用吗?我只是愚蠢吗
我非常感谢您对这个话题的任何见解。这让我发疯。使用核心数据。它可以顺利处理所有关系。然而,核心数据是基于类的。正如瓦迪安所说,使用核心数据或其他数据库引擎来存储数据。您拥有的模型结构很好,但存储在属性中的数据很短,并且存储在内存中。你不应该有一个内存中的模型,它可以从各种地方得到更新。从数据库加载模型,做你需要做的并保存更改,在需要的地方重复。是的,我完全同意。我最初开始考虑这一点的原因是我想创建独立和分离的代码。这个想法是让你可以插入任何东西(比如CoreData),但它可以自己工作。这感觉像是“正确”的方式。也许这个假设很愚蠢?在我过去的项目中,我使用领域作为数据库,我发现对于小项目来说,使用核心数据要容易得多(轻量级)。至于您的观察者,它确实提供了
NotificationToken
,允许您观察对象、查询等的更改。使用核心数据。它可以顺利处理所有关系。然而,核心数据是基于类的。正如瓦迪安所说,使用核心数据或其他数据库引擎来存储数据。您拥有的模型结构很好,但存储在属性中的数据很短,并且存储在内存中。你不应该有一个内存中的模型,它可以从各种地方得到更新。从数据库加载模型,做你需要做的并保存更改,在需要的地方重复。是的,我完全同意。我最初开始考虑这一点的原因是我想创建独立和分离的代码。这个想法是让你可以插入任何东西(比如CoreData),但它可以自己工作。这感觉像是“正确”的方式。也许这个假设很愚蠢?在我过去的项目中,我使用领域作为数据库,我发现对于小项目来说,使用核心数据要容易得多(轻量级)。至于您的观察者,它确实提供了NotificationToken
,允许您观察对象、查询等方面的更改。