如何解决 SwiftData 错误“类型‘*’不符合协议‘PersistentModel’”

Bri*_*ubt 12 swift swift-data ios17

完成 SwiftData 的测试版并尝试建立PersistentContainer. 我在我的上设置了一个modelContainer视图修改器ContentView,并使我的类符合@Model各种 WWDC 视频(已发布的视频)中所述的要求。

这是我要存储的基础对象,其中所有变量都符合Codable

Board.swift

import SwiftData

@Model
class Board {
    var size: Int = 3
    var cellSize: CGFloat = 44
    var numberOfTeamMembers: Int = 3
    var numberOfEnemies: Int = 3
    var spaces: [[Space]] = []
    var selectedSpace: Space? = nil
    var characters: [Space: Character] = [:]
    var selectedCharacter: Character? = nil
    var attackableSpaces: [Space] = []
    var movableSpaces: [Space] = []
    var teams: [Team] = []
    var localTeam: Team? = nil
    var currentTeam: Team? = nil
    var gamePhase: GamePhase = GamePhase.pickTeam
    var actions: [Action] = []
    var unoccupiedSpaces: [Space] = []
    var tilt: CGFloat = 1
    var availableMoves: [UUID: [TurnPhase]] = [:]
    var turn: Turn = Turn.mine
}
Run Code Online (Sandbox Code Playgroud)

ContentView.swift

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: [Board.self])
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到以下编译错误:

Swift 数据错误

类型“Board”不符合协议“PersistentModel”

对实例方法“setValue”的调用没有完全匹配

尝试按照文档描述实施,但效果不太好。我哪里做错了?

Ben*_*ale 9

您的实现是正确的,但 Swift 编译器中存在一个错误(现已修复,但尚未在 Xcode 15.0 beta 2 中修复),导致此操作无法正常工作。该错误与其他范围的宏扩展的可见性有关,因此解决方法是删除#Preview将宏(例如@Model)类型作为参数的视图上的 s。

注意:这一发现和解决方法归功于Holly Borla

更新:这似乎已在 Xcode 15.0 beta 3 中修复。