gpt4 book ai didi

objective-c - enumerateObjectsUsingBlock : used for? 的 BOOL *stop 参数是什么

转载 作者:IT老高 更新时间:2023-10-28 11:21:39 26 4
gpt4 key购买 nike

我最近一直在使用 enumerateObjectsUsingBlock: 来满足我的快速枚举需求,但我很难理解 BOOL *stop 在枚举 block 。

NSArray 类引用状态

stop: A reference to a Boolean value. The block can set the value to YES to stop further processing of the array. The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block.

那么我当然可以在我的 block 中添加以下内容来停止枚举:

if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}

据我所知,不明确将 *stop 设置为 YES 不会产生任何负面影响。枚举似乎在数组末尾自动停止。那么在一个 block 中使用 *stop 真的有必要吗?

最佳答案

Block 的 stop 参数允许您提前停止枚举。它相当于普通 for 循环中的 break。如果要遍历数组中的每个对象,可以忽略它。

for( id obj in arr ){
if( [obj isContagious] ){
break; // Stop enumerating
}

if( ![obj isKindOfClass:[Perefrigia class]] ){
continue; // Skip this object
}

[obj immanetizeTheEschaton];
}

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if( [obj isContagious] ){
*stop = YES; // Stop enumerating
return;
}

if( ![obj isKindOfClass:[Perefrigia class]] ){
return; // Skip this object
}

[obj immanentizeTheEschaton];
}];

这是一个 out 参数,因为它是对来自调用范围的变量的引用。它需要在你的 Block 中设置,但在 enumerateObjectsUsingBlock: 中读取,就像 NSError 通常从框架调用传回你的代码一样。

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
// N.B: This is probably not how this method is actually implemented!
// It is just to demonstrate how the out parameter operates!

NSUInteger idx = 0;
for( id obj in self ){

BOOL stop = NO;

block(obj, idx++, &stop);

if( stop ){
break;
}
}
}

关于objective-c - enumerateObjectsUsingBlock : used for? 的 BOOL *stop 参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com