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
相关产品推荐
相关产品推荐

