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

Realm中@ObservedResults如何使用实例成员作为过滤条件?

解决Realm @ObservedResults引用实例成员的初始化报错问题

Realm的@ObservedResults属性包装器可用于带过滤条件的数据查询,比如固定值过滤的场景:

@ObservedResults(Dog.self, where: { $0.weight > 40 }) var dogs

但当尝试引用视图实例的minWeight属性作为过滤条件时,会触发初始化顺序报错:

Cannot use instance member 'minWeight' within property initializer; property initializers run before 'self' is available

以下是除静态变量外的两种可行解决办法:

方案一:在初始化方法中手动初始化属性包装器

struct ExampleStruct: View {
    let minWeight: Int
    @ObservedResults(Dog.self) var dogs
    
    init(minWeight: Int) {
        self.minWeight = minWeight
        // 手动初始化属性包装器的存储属性,此时minWeight已完成初始化
        _dogs = ObservedResults(Dog.self, where: { $0.weight > minWeight })
    }
    
    var body: some View {
        List(dogs) { dog in
            Text("\(dog.name) - \(dog.weight)kg")
        }
    }
}

适用场景:minWeight是固定值,不会在视图生命周期内变化。

方案二:动态设置过滤条件(支持值更新)

struct ExampleStruct: View {
    var minWeight: Int
    @ObservedResults(Dog.self) var dogs
    
    var body: some View {
        List(dogs) { dog in
            Text("\(dog.name) - \(dog.weight)kg")
        }
        .onAppear {
            // 视图初始化完成后,通过projected value动态设置过滤条件
            $dogs.where = { $0.weight > minWeight }
        }
        // 如果minWeight会动态变化,可添加监听实时更新过滤规则
        .onChange(of: minWeight) { newMin in
            $dogs.where = { $0.weight > newMin }
        }
    }
}

适用场景:minWeight可能在视图生命周期内动态变化,需要实时更新查询结果。

内容的提问来源于stack exchange,提问作者royB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:41:29