Swift 对闭包结果进行强制转换

Swift 对闭包结果进行强制转换,swift,closures,realm,Swift,Closures,Realm,我有一个领域声明,比如 let foundFruits = try! Realm().objects(fruits.self).filter("color = 'red'") let foundFruits = try! Realm().objects(fruits.self).filter({ $0.weight > o.7 $0.maxweight }) 我在Tableview中使用的结果 . . 。 . . 现在我做第二个陈述,如 let foundFruits = try

我有一个领域声明,比如

let foundFruits = try!  Realm().objects(fruits.self).filter("color = 'red'")
let foundFruits = try!  Realm().objects(fruits.self).filter({ $0.weight > o.7 $0.maxweight })
我在Tableview中使用的结果 . .

。 . . 现在我做第二个陈述,如

let foundFruits = try!  Realm().objects(fruits.self).filter("color = 'red'")
let foundFruits = try!  Realm().objects(fruits.self).filter({ $0.weight > o.7 $0.maxweight })
但是由于闭包,我得到了错误

无法指定类型的值 “LazyFilterBidirectionalCollection>”以键入 “结果”


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

您试图实现的目标是不可能的。Realm不提供自定义筛选块的功能,因此,如果要保留查询的自动更新
结果
类型,则需要使用
NSPredicate
筛选结果。但是,在
NSPredicate
s中只能使用常量或键路径进行比较,因此
“weight>0.7*maxWeight”
将导致无效谓词

一个可行的解决方法似乎是为对象类创建一个计算属性,其值为
0.7*maxWeight
,但也可以

您想要实现的筛选只能使用Swift的内置筛选方法,但正如您所见,使用内置Swift筛选的返回类型不会是
结果

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

这就是您如何实现解决方案:

var foundFruits: Array<Fruit> {
    return Array(try! Realm().objects(Fruit.self).filter({Double($0.normalWeight) > 0.7*Double($0.maxWeight)}))
}

print(foundFruits)
var:Array{
返回数组(try!Realm().objects(Fruit.self).filter({Double($0.normalWeight)>0.7*Double($0.maxWeight)}))
}
印刷品(水果)

还要确保遵守Swift命名约定,这是类名的大写形式。为此,我已将您的
fruits
类重命名为
Fruit
,在项目中使用这段代码时请记住这一点。

您试图实现的目标是不可能的。Realm不提供自定义筛选块的功能,因此,如果要保留查询的自动更新
结果
类型,则需要使用
NSPredicate
筛选结果。但是,在
NSPredicate
s中只能使用常量或键路径进行比较,因此
“weight>0.7*maxWeight”
将导致无效谓词

一个可行的解决方法似乎是为对象类创建一个计算属性,其值为
0.7*maxWeight
,但也可以

您想要实现的筛选只能使用Swift的内置筛选方法,但正如您所见,使用内置Swift筛选的返回类型不会是
结果

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

这就是您如何实现解决方案:

var foundFruits: Array<Fruit> {
    return Array(try! Realm().objects(Fruit.self).filter({Double($0.normalWeight) > 0.7*Double($0.maxWeight)}))
}

print(foundFruits)
var:Array{
返回数组(try!Realm().objects(Fruit.self).filter({Double($0.normalWeight)>0.7*Double($0.maxWeight)}))
}
印刷品(水果)
还要确保遵守Swift命名约定,这是类名的大写形式。为此,我已将您的
fruits
类重命名为
Fruit
,在项目中使用这段代码时请记住这一点