Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第 2 章:创建第一个 SwiftData 应用

第 2 章:创建第一个 SwiftData 应用

定义你的第一个数据模型 (@Model)

1. @Model 宏的基本用法

SwiftData 的核心是数据模型定义,通过 @Model 宏可以快速声明一个持久化模型:

import SwiftData

@Model
class Book {
    var title: String
    var author: String
    var publishDate: Date
    
    init(title: String, author: String, publishDate: Date) {
        self.title = title
        self.author = author
        self.publishDate = publishDate
    }
}

2. 模型属性的特性

  • 自动持久化:所有存储属性默认会被持久化
  • 延迟加载:使用 @Attribute(.externalStorage) 标记大数据类型(如二进制数据)
  • 唯一标识:@Attribute(.unique) 可强制属性唯一性
@Model
class User {
    @Attribute(.unique) var id: UUID
    @Attribute(.externalStorage) var avatar: Data?
}

3. 模型继承规则

  • 支持从 NSObject 或其他 @Model 类继承
  • 父类需标记为 @Model 才会持久化父类属性
@Model
class MediaItem {
    var createDate: Date
}

@Model 
class Movie: MediaItem {
    var duration: TimeInterval
}

4. 模型验证器

通过 @Model 宏的 validation 参数添加验证逻辑:

@Model(validation: {
    guard $0.pages > 0 else { 
        throw ValidationError("Page count must be positive")
    }
})
class ValidatedBook {
    var pages: Int
}

5. 模型版本控制

建议在模型类添加版本标识符:

@Model
class VersionedModel {
    static let schemaVersion = 1
    //...
}

最佳实践

  1. 使用 final class 提高性能
  2. 为模型设计合理的初始化方法
  3. 将复杂业务逻辑放在扩展中
@Model
final class Product {
    var name: String
    var price: Double
}

extension Product {
    func applyDiscount(rate: Double) {
        price *= (1 - rate)
    }
}

注意:模型类必须定义为引用类型(class),结构体(struct)不被支持

Last Updated:: 5/30/25, 5:21 PM