SwiftData|小心使用 Struct 和 Enum 类型

SwiftData 中虽然支持使用符合 Codable 协议的 Struct 和 Enum 类型,但也会带来一些问题。

SwiftData|小心使用 Struct 和 Enum 类型

SwiftData 支持符合 Codable 协议的 Struct、Enum 类型。但基于我自己的经验,并不推荐使用。

谓词不支持 Struct 和 Enum

截止 iOS18,SwiftData 仍然不支持在谓词查询中使用 Struct 和 Enum 类型中的值。

这意味着只能在内存中进行排序、筛选,当数据量较大时,会带来性能上的问题。

必要时创建 Model 模型

经过对 Apple 提供的 SwiftData 示例项目的研究,我总结出两个特点:

  • 优先使用扁平化的数据结构。
  • 避免使用基本类型的数组,例如[String][Int],除非是[Model]
  • 对于结构化内容,创建单独的 Model 模型。

优先使用扁平化的数据结构

在苹果的示例项目中,我们可以看到,在 Backyard 模型中,创建了大量扁平化的属性,并且这些属性以基本类型为主:

避免使用基本类型的数组

主要是 String 类型的数组,在 Filmo 项目中,因为使用了 String 类型的数组属性,在 iOS 17 适配过程中增加了很多工作量。

我在这篇文章中详细解释了为什么:

SwiftData|避免使用 String 类型数组
了解 SwiftData 支持的 Swift 类型,以及为什么不推荐在 SwiftData 中使用 String 类型的数组。

必要是创建单独的 Model 模型

在 Backyard 项目中,Apple 创建了多个关联的 Model 模型,这种方式渐进式开发时更轻松,并且对 Swift 谓词更友好: