iOS 中的循環(huán)遍歷

集合類(lèi)對(duì)象

主要包括數(shù)組(NSArray 類(lèi)簇)、字典(NSDictionary 類(lèi)簇)、集合(NSSet 類(lèi)簇),例如

NSArray *array = @[@"Apple", @"Banana", @"Cherry", @"Dates"];
NSDictionary *dictionary = @{@"One": @"Apple", @"Two": @"Banana", @"Three": @"Cherry"};
NSSet *set = [NSSet setWithObjects:@"One", @"Two", @"Three", nil];

遍歷

集合類(lèi)對(duì)象遍歷有 enumerateObjectsXXX 和 for 兩種

for 循環(huán)

for 語(yǔ)句

支持遍歷 NSArray,不支持遍歷 NSDictionay 和 NSSet
支持遍歷數(shù)組對(duì)象中的每一個(gè)對(duì)象,也支持按步長(zhǎng)進(jìn)行遍歷

// 遍歷每一個(gè)對(duì)象
for (int i = 0; i < array.count; i++) {
  NSLog("%@", array[i]);
  if ([obj isEqualToString:@"Cherry"]) {
        break;
    }
}
// 按步長(zhǎng)遍歷
for (init i=0; i<array.count; i=i+2) {
  NSLog("%@", array[i]);
}

for-in 語(yǔ)句

支持所有集合類(lèi)對(duì)象,不支持按步長(zhǎng)遍歷

// 字典,無(wú)序遍歷
for (NSString *key in dictionary) {
    NSLog(@"Key: %@, Value: %@", key, [dictionary objectForKey:key]);
}
// 集合,無(wú)序遍歷
for (NSString *item in set) {
    NSLog(@"%@", item);
}

enumerateObjects

使用方式

// 數(shù)組
[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"Item at index %lu is %@", (unsigned long)idx, obj);
    
    // 如果遇到 "Cherry",停止遍歷
    if ([obj isEqualToString:@"Cherry"]) {
        *stop = YES;
    }
}];
// 字典
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"Key: %@, Value: %@", key, obj);
}];
// 集合
[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    NSLog(@"Object: %@", obj);
}];

使用注意

  • 如果要更改 block 外的數(shù)據(jù),需使用 __block 修飾符
// 字典
__block int count = 0;
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"Key: %@, Value: %@", key, obj);
    count++;
}];
  • 閉包(block) 前后無(wú)需使用 weak 和 strong 修飾
    使用 NS_NOESCAPE 修飾符時(shí),有助于編譯器做優(yōu)化,也用于阻止閉包捕獲并保留self,防止?jié)撛诘难h(huán)引用。
// NSDictionary.h
- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(KeyType key, ObjectType obj, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

支持并行處理元素:如果你的數(shù)據(jù)集大,并且每個(gè)元素的處理是相互獨(dú)立的,那么利用 enumerateObjectsUsingBlock: 的并發(fā)功能可以提高效率。這可以通過(guò) enumerateObjectsWithOptions:usingBlock: 方法中的 NSEnumerationConcurrent 選項(xiàng)來(lái)實(shí)現(xiàn)。

停止遍歷,跳出循環(huán)enumerateObjectsUsingBlock: 方法允許你在 block 內(nèi)部提前停止遍歷。只需要設(shè)置傳入 block 的 stop 參數(shù)為 YES,就可以停止遍歷。這對(duì)于需要在找到滿足特定條件的元素后立即停止遍歷的環(huán)境(如查找操作)非常有用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容