ios 将SwiftUI应用程序转换为SwiftData:单个@Model类与每个实体的单独模型[已关闭]

iq0todco  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(125)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

23小时前关闭
截至18小时前,社区正在审查是否重新讨论这个问题。
Improve this question
假设你有一个SwiftUI应用,比如landmarks app,它目前有一个Observable类示例负责为整个应用提供数据:

@Observable
class ModelData {
    var landmarks: [Landmark] = load("landmarkData.json")
    var hikes: [Hike] = load("hikeData.json")
    var profile = Profile.default

    var features: [Landmark] {
        landmarks.filter { $0.isFeatured }
    }

    var categories: [String: [Landmark]] {
        Dictionary(
            grouping: landmarks,
            by: { $0.category.rawValue }
        )
    }
}

字符串
它是这样提供给应用程序的:

@main
struct LandmarksApp: App {
    @State private var modelData = ModelData()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(modelData)
        }
    }
}


并在应用程序的各个组件中访问,如下所示:

@Environment(ModelData.self) var modelData


如果我们要将此应用程序转换为SwiftData,我们可以:
A)分别对Landmark和Hike对象进行建模,方法是在每个对象上放置“@Model”..
B)或者..(这是问题所在).

@Model
class ModelData {
    var landmarks: [Landmark]
    var hikes: [Hike]
    var profile: Profile
    
    var features: [Landmark] {
        landmarks.filter { $0.isFeatured }
    }
    var categories: [String: [Landmark]] {
        Dictionary(
            grouping: landmarks,
            by: { $0.category.rawValue }
        )
    }
    
    init(landmarks: [Landmark] = load("landmarks.json"), hikes: [Hike] = load("hikes.json"), profile:Profile = Profile.default) {
        self.landmarks = landmarks
        self.hikes = hikes
        self.profile = profile
    }
}


..
然而,当我继续选择A时,我意识到我已经失去了实用函数,它们将不得不分散在代码库中。
这些方法是否同样有效?

7nbnzgx9

7nbnzgx91#

Swift Data是关于持久性的,而ModelData是关于运行时的应用状态。
因此,您将创建单独的HikeLandmark@Model实体;这是您的“选项A”

相关问题