如何快速洗牌RLMResults?

时间:2015-07-06 04:50:48

标签: ios swift realm

我知道如何随机随机播放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
}

2 个答案:

答案 0 :(得分:3)

首先快速说明:RLMResults没有已定义的订单,除非它们是通过RLMSortDescriptor排序的。

相反,要随机排序,您有两个选择:

  1. 向对象架构添加整数属性,并为所有对象分配随机值。然后,您可以使用RLMSortDescriptorRLMResults对对象进行排序。

  2. 如上面的评论中所述,将RLMObjects复制到数组中并对其执行随机排序。

  3. 以下是执行此操作的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()