集合類(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)境(如查找操作)非常有用。