You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中@State配置SortDescriptor初始化报错的解决方法

解决Core Data FetchRequest初始化错误及动态修改排序规则

问题说明

尝试通过按钮修改Core Data的SortDescriptor,将排序键路径sorting和排序顺序sortOrder改为@State变量时,触发错误:

Variable 'self.fetchRequest' used before being initialized

原代码如下:

@Environment(\.managedObjectContext) private var viewContext
    
@State var sorting: KeyPath = \Log.diveNr
@State var sortOrder: SortOrder = .forward
    
private var fetchRequest: FetchRequest<Log>
private var logs: FetchedResults<Log> {
    fetchRequest.wrappedValue
}
    
init() {
    fetchRequest = FetchRequest(sortDescriptors: [SortDescriptor(sorting, order: sortOrder)])
}

问题原因

@State变量的初始化时机晚于视图的init方法,在init中访问sorting和sortOrder时,这两个变量尚未完成初始化,导致无法正确创建FetchRequest。

解决方案

直接使用@FetchRequest属性包装器声明logs,无需手动初始化FetchRequest。后续可通过修改logs.sortDescriptors动态更新排序规则:

@FetchRequest(sortDescriptors: [SortDescriptor(\.diveNr, order: .forward)])
var logs: FetchedResults<Log>

var body: some View {
    NavigationStack {
        List{
            if logs.count == 0 {
                Text("未找到日志")
            }
            Button("切换排序顺序") {
                logs.sortDescriptors = [SortDescriptor(\.diveNr, order: .reverse)]
            }
            ForEach(logs){log in
                NavigationLink(destination: DiveLogDetailView(diveNo: 1, diveSite: "Vela Garska")) {
                    DiveLogListObject(log: log)
                }
            }
            .onDelete(perform: deleteLog)
        }
    }
}

内容的提问来源于stack exchange,提问作者luegm.dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:05:15