领域IOS投射结果

时间:2017-08-29 04:51:19

标签: swift closures realm

我有一个像

这样的领域声明
let foundFruits = try!  Realm().objects(fruits.self).filter("color = 'red'")

我在Tableview中使用的结果 。 。

let fruit = foundFruits[indexPath.row]
cell.color.text = fruit.color

。 。 。 现在我做了第二个声明,如

let foundFruits = try!  Realm().objects(fruits.self).filter({ $0.weight > o.7 $0.maxweight })

但由于关闭,我得到了错误

  

无法指定类型的值   'LazyFilterBidirectionalCollection>'输入   '结果'

如何转换第二个语句的结果,以便我可以将它用于我的tableview ??

1 个答案:

答案 0 :(得分:-1)

你想要实现的目标是不可能的。 Realm不提供自定义过滤器块的功能,因此如果要保留查询的自动更新Results类型,则需要使用NSPredicate来过滤结果。但是,您只能在NSPredicate中使用常量或键路径进行比较,因此"weight > 0.7*maxWeight"会导致谓词无效。

一个可行的解决方法似乎是为您的对象类创建一个计算属性,其值为0.7*maxWeight,但Realm doesn't support computed properties in queries也是。

您希望实现的过滤只能使用Swift内置的过滤方法,但正如您所看到的,使用内置Swift过滤器的返回类型将不是Results

如果你真的需要这个谓词,目前,一个可行的解决方法是将结果存储在Swift数组中,并在每次需要使用它时更新该数组。您可以将foundFruits声明为Array<Fruit>类型的计算属性,这样当您尝试访问它时,它会自动更新(即使性能可能会比{{1更差)因为使用它,每次访问`foundFruits时都需要运行查询。

这就是您如何实现变通方法:

Results

还要确保符合Swift命名约定,即类名称的Upper-camelCase。为此,我已将您的var foundFruits: Array<Fruit> { return Array(try! Realm().objects(Fruit.self).filter({Double($0.normalWeight) > 0.7*Double($0.maxWeight)})) } print(foundFruits) 课程重命名为fruits,请在项目中使用此代码时牢记这一点。