我知道如何随机随机播放RLMResults
?无论如何我都无法通过RLMSortDescriptor
找到它。
我尝试编写自己的交换算法,但是它给了我错误(不能分配给这个表达式的结果*)。
func simpleRandomSwap(rlmobjects:RLMResults!) -> RLMResults! {
if (rlmobjects != nil && rlmobjects.count > 0) {
let indexcount = Int(rlmobjects.count)
for (var i=0 ; i<indexcount; i++) {
let randomUInt:UInt = UInt(arc4random_uniform(UInt32(indexcount)))
let myuint = UInt(i)
// simple swap
var temp = rlmobjects.objectAtIndex(myuint)
rlmobjects.objectAtIndex(randomUInt) = rlmobjects.objectAtIndex(myuint)
rlmobjects.objectAtIndex(myuint) = temp
} // end for loop
}
return rlmobjects
}
答案 0 :(得分:3)
首先快速说明:RLMResults
没有已定义的订单,除非它们是通过RLMSortDescriptor
排序的。
相反,要随机排序,您有两个选择:
向对象架构添加整数属性,并为所有对象分配随机值。然后,您可以使用RLMSortDescriptor
和RLMResults
对对象进行排序。
如上面的评论中所述,将RLMObjects
复制到数组中并对其执行随机排序。
以下是执行此操作的RLMObject
的扩展名:
extension RLMResults {
public func toShuffledArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for result in self {
if let result = result as? T {
array.append(result)
}
}
let count = array.count
if count > 1 {
for i in 0..<(count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + Int(i)
swap(&array[i], &array[j])
}
}
return array
}
}
你会这样称呼:
let shuffled = results.toShuffledArray(TestObject.self)
答案 1 :(得分:0)
快捷键5:
您可以使用默认方法:
let shuffled = results.shuffled()