我对 Swift 编程还比较陌生(大约 2 个月)。我创建了一个简单的 SwiftData 架构,由下表组成:
活动类型 活动 挑战集团 挑战
@Model
final class ActivityType: Identifiable, Hashable {
@Attribute(.unique) var activityTypeName: String
var activityTypeIcon: String
@Relationship(inverse: \Activity.activityType) var activities: [Activity]
@Model
final class Activity: Identifiable, Hashable {
@Attribute(.unique) var id: Int
var activityName: String
@Relationship(inverse: \ChallengeGroup.activity) var challengeGroups: [ChallengeGroup]
var activityType: ActivityType?
@Model
final class ChallengeGroup: Identifiable, Hashable {
@Attribute(.unique) var id: Int
var challengeGroupName: String
var category: String
@Relationship(inverse: \Challenge.challengeGroup) var challenges: [Challenge]
var activity: Activity?
@Model
final class Challenge: Identifiable, Hashable {
@Attribute(.unique) var id: Int
var challengeName: String
var challengeGroup: [ChallengeGroup]
我在尝试获取特定活动的所有挑战时遇到问题。
我尝试在结构中声明:
@Query var challenges: [Challenge]
然后在 init() 中:
init(for activity: Activity) {
let id = activity.id
self._challenges = Query(filter: #Predicate {
$0.challengeGroup.activity?.id == id. <== error here
}, sort: \.challengeName)
self.activity = activity
}
我收到错误“‘[ChallengeGroup]’类型的值没有成员‘活动’”——这是有道理的,因为 ChallengeGroup 被声明为 ChallengeGroup 数组。所以如果我尝试:
init(for activity: Activity) {
let id = activity.id
self._challenges = Query(filter: #Predicate {
$0.[challengeGroup].activity?.id == id. <== error here
}, sort: \.challengeName)
self.activity = activity
}
我现在在名称周围添加了方括号,但收到错误:预期成员名称位于“.”之后
我真的被这个问题困住了,不知道如何继续——这似乎是第 22 条军规。你能为我的问题提供一些解决方案吗?
非常感谢。
您只能在视图内使用 Query,以便可以直接排除这种情况,并且您不应尝试在 init 内获取数据,因此此处的替代方案不相关。
将
categories
设置为一个空数组,稍后(在 init 之后)将对象添加到该空数组中,或者将它们作为另一个参数传递给 init
init(for activity: Activity, challenges: [Challenge]) {
self.challenges = challenges
self.activity = activity
// other properties...
}
我认为 init 是用于
ChallengeGroup
,问题没有说明任何内容,但它是唯一适合的类型
然后我们还有一些其他问题
challengeGroupName
和category
需要设置为id
属性设置为另一个对象类型的 id,特别是当您声明它是唯一的时,因为这样您在运行时会收到错误,因为这里有一对多关系。我建议您删除 all模型的
id
属性,因为 @Model
宏会自动为您添加一个。