william_0353 2024-07-24 21:32 采纳率: 33.3%
浏览 21
已结题

swiftui @query 报错

swiftUI 尝试构建一个笔记类的app,用户可以导入pdf,然后在pdf添加笔记,但是现在遇到一个编译报错如下:
== PREVIEW UPDATE ERROR:

SchemeBuildError: Failed to build the scheme “AIreader”

'Element' is not a member type of generic enum '[AIreader.ContentModel]?'

Emitting module for AIreader:
/var/folders/wb/hw9lz_yj2cl78nrb0tvfrh1w0000gn/T/swift-generated-sources/@__swiftmacro_8AIreader11ContentViewV12contentModel33_48E5B9AF3FB619EEEC334395AF9ABA5CLL5QueryfMp_.swift:1:66: error: 'Element' is not a member type of generic enum '[AIreader.ContentModel]?'
private (set) var _contentModel: SwiftData.Query<[ContentModel]?.Element, [ContentModel]?> = .init()
                                                 ~~~~~~~~~~~~~~~ ^
/Users/xx/Library/Mobile Documents/com~apple~CloudDocs/app_AiReader/AIreader/AIreader/Views/ContentView.swift:16:5: note: in expansion of macro 'Query' on property 'contentModel' here
    @Query private var contentModel: [ContentModel]?
    ^                  ~~~~~~~~~~~~
Swift.Optional:1:21: note: 'Optional' declared here
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
                    ^

这是报错代码:


struct ContentView: View {
    let fileURL: URL
    let onClose: () -> Void
    
    @State private var isDrawing: Bool = false
    @State private var currentPage: Int = 0  // 当前页码
    @State private var currentNotes: [Note] = []
    @State private var currentCards: [Card] = []
    @State private var currentOutlines: [Outline] = []
    
    @Environment(\.modelContext) private var modelContext: ModelContext
    @Query private var contentModel: [ContentModel]?
    
    init(fileURL: URL, onClose: @escaping () -> Void) {
        self.fileURL = fileURL
        self.onClose = onClose
        
        print("contentview iunit")
        _contentModel = Query(filter: #Predicate<ContentModel> { $0.fileName == fileURL.lastPathComponent })
    }
    

报错位置在query这里:

img

model结构如下,供参考

@Model
final class ContentModel {
    @Attribute(.unique) var fileName: String
    var currentPage: Int?
    var outlineList: [Outline]?
    var noteList: [Note]?
    var cardList: [Card]?
    
    
    init(fileName: String,
         currentPage: Int? = nil,
         outlineList: [Outline]? = nil,
         noteList: [Note]? = nil,
         cardList: [Card]? = nil) {
        
        self.fileName = fileName
        self.currentPage = currentPage
        self.noteList = noteList
        self.outlineList = outlineList
        self.cardList = cardList
    }
    
}

  • 写回答

32条回答 默认 最新

  • 妄北y 嵌入式领域优质创作者 2024-07-24 21:32
    关注
    获得0.50元问题酬金

    以下参考免费微信小程序:皆我百晓生 作答,并由妄北y整理回复。

    根据你提供的代码和错误信息,问题出现在使用 @Query 属性包装器时,SwiftUI 不能正确地推断出 Element 类型。这通常是因为泛型参数没有被正确地指定。

    问题分析

    你的代码中使用了 @Query 属性包装器,但是没有正确地指定泛型参数。@Query 需要两个泛型参数:

    1. Filter Type:表示查询的过滤条件类型。
    2. Result Type:表示查询结果的类型。

    在你的代码中,@Query 没有提供第二个泛型参数,这导致了编译错误。

    解决方案

    要解决这个问题,你需要为 @Query 提供正确的泛型参数。以下是修改后的代码:

    import SwiftUI
    import SwiftData
    
    struct ContentView: View {
        let fileURL: URL
        let onClose: () -> Void
        
        @State private var isDrawing: Bool = false
        @State private var currentPage: Int = 0  // 当前页码
        @State private var currentNotes: [Note] = []
        @State private var currentCards: [Card] = []
        @State private var currentOutlines: [Outline] = []
        
        @Environment(\.modelContext) private var modelContext: ModelContext
        
        // 使用 @Query 时,需要指定 Filter Type 和 Result Type
        @Query private var contentModel: Query<ContentModel, ContentModel>?
        
        init(fileURL: URL, onClose: @escaping () -> Void) {
            self.fileURL = fileURL
            self.onClose = onClose
            
            print("contentview iunit")
            _contentModel = Query(filter: \ContentModel.fileName == fileURL.lastPathComponent)
        }
        
        var body: some View {
            // ...
        }
    }
    
    @Model
    final class ContentModel {
        @Attribute(.unique) var fileName: String
        var currentPage: Int?
        var outlineList: [Outline]?
        var noteList: [Note]?
        var cardList: [Card]?
        
        init(fileName: String,
             currentPage: Int? = nil,
             outlineList: [Outline]? = nil,
             noteList: [Note]? = nil,
             cardList: [Card]? = nil) {
            
            self.fileName = fileName
            self.currentPage = currentPage
            self.noteList = noteList
            self.outlineList = outlineList
            self.cardList = cardList
        }
    }
    

    详细解释

    1. @Query 属性包装器:在 SwiftUI 中,@Query 属性包装器用于获取模型的查询结果。它需要两个泛型参数:Filter TypeResult Type。在你的代码中,Filter TypeContentModelResult Type 也是 ContentModel

    2. 初始化 Query:在 init 方法中,你尝试初始化 _contentModel,但是没有正确地指定过滤条件。使用 Query 时,需要使用 filter 参数指定过滤条件,例如 filter: \ContentModel.fileName == fileURL.lastPathComponent

    3. SwiftData:确保你已经正确地引入了 SwiftData 库,并在项目中正确地配置了模型。

    通过以上修改,你的代码应该可以正常编译并运行。如果仍然遇到问题,请确保所有相关的 SwiftData 库和依赖项都已正确导入和配置。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月1日
  • 创建了问题 7月24日

悬赏问题

  • ¥30 stm32f103c8t6制作万能红外遥控器
  • ¥15 有人会fastcrud写前端页面吗
  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?