SubTask.ID访问权限错误:为何SubTaskListView报错而RowView正常?
问题原因与解决方法
原因
SwiftData的@Model类默认会自动生成一个ID关联类型(用于实现PersistentIdentifier协议),但这个自动生成的关联类型访问级别为internal——即使你把SubTask类标记为public也不会改变这个默认行为。
- 在
SubTaskRowView中,因为存在@Bindable var subTask: SubTask实例,编译器可以通过subTask.id的公开类型(UUID)隐式解析SubTask.ID的实际类型,因此不会触发访问权限错误。 - 而在
SubTaskListView中,你直接引用SubTask.ID,此时编译器需要直接访问这个internal的关联类型,所以抛出'ID' is inaccessible due to 'internal' protection level错误。
解决方法
有两种可行的解决方式:
方式一:显式声明公开的ID关联类型
在SubTask.swift中,显式添加public的ID类型别名,和你的主键属性类型保持一致:
@Model final public class SubTask { // 显式声明public的ID关联类型,对应主键id的类型 public typealias ID = UUID @Attribute(.unique, originalName: "id") public var id: UUID @Attribute(originalName: "created_at") var createdAt: Date @Attribute(originalName: "updated_at") var updatedAt: Date @Attribute(originalName: "name") var name: String @Attribute(originalName: "task") var task: Task? // 初始化方法保持不变... }
方式二:直接使用主键的实际类型替代SubTask.ID
因为你的SubTask.id属性类型是UUID,可以直接在SubTaskListView中用UUID代替SubTask.ID:
// SubTaskListView.swift中修改这一行 @FocusState var focusedId: UUID?
这种方式更简洁,功能和使用SubTask.ID完全一致。
内容的提问来源于stack exchange,提问作者Tony Cheng
相关产品推荐
相关产品推荐

