将块内的变量分配给块外的变量

tom*_*mmi 376 compiler-errors objective-c objective-c-blocks

我收到了一个错误

变量不可分配(缺少__block类型说明符)

就行了aPerson = participant;.如何确保块可以访问aPerson变量并且aPerson可以返回变量?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;
Run Code Online (Sandbox Code Playgroud)

Dev*_*shi 769

您需要使用以下代码行来解决您的问题:

__block Person *aPerson = nil;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅本教程:块和变量

  • 请注意,`__block`以**两个**下划线为前缀. (99认同)
  • 使用`__block`我的错误消失了,但是值没有保留在块之外.这里有任何帮助 (12认同)
  • 在看起来它应该被调用的地方之后调用该块,换句话说,块不会"立即"运行. (7认同)
  • 对于发布的问题,这个答案是正确的,如果您考虑到不同的情况,请随意发布另一个问题. (3认同)

Den*_*lko 40

只是提醒我自己也犯了一个错误

 __block
Run Code Online (Sandbox Code Playgroud)

声明必须在首次声明变量时完成,即块的OUTSIDE,而不是它的内部.这应该解决关于变量不在块之外保留其值的注释中提到的问题.


Ume*_*ant 18

只需使用__block前缀来声明并在块内分配任何类型的变量.

例如:

__block Person *aPerson = nil;

__block NSString *name = nil;
Run Code Online (Sandbox Code Playgroud)


小智 10

要在块外部分配一个变量,在块之外总是使用__block说明符,那么代码应该是这样的: -

__block Person *aPerson = nil;
Run Code Online (Sandbox Code Playgroud)


小智 10

__block Person *aPerson = nil;
Run Code Online (Sandbox Code Playgroud)