2012-04-02 115 views
7

我可以通過檢索隨機索引從類似數組的結構中獲取一個隨機值。如何從NSSet實例中檢索一個隨機對象?

如何從存儲NSNumber對象的NSSet對象中獲取隨機值?我無法找到NSSet的實例方法,該方法檢索隨機值。

+2

使用的第一個建議去要去的'[MYSET allObjects]'它會返回一個數組,然後使用您現有的邏輯獲得隨機索引 – 2012-04-02 18:38:21

+0

bbum在我的答案中發現了一個很大的錯誤,謝謝。刪除。 – Almo 2012-04-02 18:41:01

+1

你想要隨機,還是你不在乎哪個?具體來說,我的意思是,「你知道嗎 - [NSSet anyObject]?」 – 2012-04-02 19:01:47

回答

5

總之,您不能直接從NSSet中檢索隨機對象。

您可能需要將該集合轉換爲數組 - 通過重新設計您的代碼來使用數組,或者您可以使用這一位僞代碼來實現這一點:

randomIndex = ...random-generator....(0 .. [set count]); 
__block currentIndex = 0; 
__block selectedObj = nil; 
[set enumerateObjectsWithOptions:^(id obj, BOOL *stop) { 
    if (randomIndex == currentIndex) { selectedObj = obj; *stop = YES } 
    else currentIndex++; 
}]; 
return selectedObj; 

是 - 它在抓取對象時遍歷集合,可能是整個集合。然而,無論如何,這個迭代幾乎會在轉換爲NSArray時發生。只要設置的不是那麼大,而且你不是經常呼叫它,沒什麼大不了的。

+0

這裏的一般想法是正確的,但是我需要調整它並實現僞代碼以便編譯。這是我的版本:https://gist.github.com/4392708 – Eliot 2012-12-27 22:30:32

4

雖然我喜歡@bbum答案在某些情況下會因爲在枚舉塊中使用stop提前終止。

出於可讀性和易於記住什麼,當你重溫在未來的這個代碼,我會與他的turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count]) 
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil;