我可以通過檢索隨機索引從類似數組的結構中獲取一個隨機值。如何從NSSet實例中檢索一個隨機對象?
如何從存儲NSNumber對象的NSSet對象中獲取隨機值?我無法找到NSSet的實例方法,該方法檢索隨機值。
我可以通過檢索隨機索引從類似數組的結構中獲取一個隨機值。如何從NSSet實例中檢索一個隨機對象?
如何從存儲NSNumber對象的NSSet對象中獲取隨機值?我無法找到NSSet的實例方法,該方法檢索隨機值。
總之,您不能直接從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時發生。只要設置的不是那麼大,而且你不是經常呼叫它那,沒什麼大不了的。
這裏的一般想法是正確的,但是我需要調整它並實現僞代碼以便編譯。這是我的版本:https://gist.github.com/4392708 – Eliot 2012-12-27 22:30:32
雖然我喜歡@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;
使用的第一個建議去要去的'[MYSET allObjects]'它會返回一個數組,然後使用您現有的邏輯獲得隨機索引 – 2012-04-02 18:38:21
bbum在我的答案中發現了一個很大的錯誤,謝謝。刪除。 – Almo 2012-04-02 18:41:01
你想要隨機,還是你不在乎哪個?具體來說,我的意思是,「你知道嗎 - [NSSet anyObject]?」 – 2012-04-02 19:01:47