【问题标题】:Inline Block With Return Type具有返回类型的内联块
【发布时间】:2014-05-11 19:30:02
【问题描述】:

是否可以在 Objective-C 中创建块内联并使用其返回类型?例如,我是否可以创建一个返回 BOOL 的块,让它内联,并将其返回类型用于赋值。

BOOL b = <inline block that returns BOOL> { // unsure of the syntax / legality of this
    return YES; // will be more logic in here, that is why I want to use a block.
};

我在使用块语法时遇到问题,不确定是否可以内联创建块。我检查了以下资源,但无济于事。

感谢您的时间和耐心,如果这碰巧是不可能的,或者很容易。

【问题讨论】:

  • 您打算将 b 用于块外的任何内容,还是所有使用返回的 bool 值的逻辑都将在块内发生?
  • 我只是将块用作其返回值。在该块中将有一个逻辑来确定它是否返回YESNO,这将被分配给b。所以不,b 不会在块中使用。 @迈克
  • 我个人根本不会使用块 - 只需将该逻辑放入函数中并调用返回布尔值的函数。

标签: objective-c objective-c-blocks


【解决方案1】:

实现该结果的另一种方法是"compound statement expression"

BOOL b = ({
    BOOL result;
    // other local variables and stuff, computing "result"
    result; // The last expression is the value of this compound statement expression. 
});

这是 C 语言的 GCC 扩展(Clang 也能理解)。它看起来 类似于块,但有所不同。

【讨论】:

    【解决方案2】:

    你需要做的是使用以下内容:

    BOOL b = ^(){ return YES; }();
    

    这实际上创建了块然后调用它。虽然读起来不太好,所以你不妨这样做:

    BOOL b = NO;
    {
        // Other stuff, will be local
        b = YES;
    }
    

    【讨论】:

      【解决方案3】:

      我真的不认为这是一个很好的理由,但你确实可以做到。只需将函数调用括号放在块之后

      BOOL b = ^{
          return YES;
      }();
      

      这实际上等同于单独声明和使用它,然后内联它。

      BOOL (^returnB)() = ^{
          return YES;
      };
      BOOL b = returnB();
      

      【讨论】:

        【解决方案4】:

        无需创建块即可执行此操作。如果您没有将 Block 本身分配给一个变量以供以后重用,那么它是没有意义的。只需进行必要的计算并将结果放入b

        BOOL b = ^BOOL(NSString * s, int n){
            unichar c = [s characterAtIndex:n];
            return c == "w";
        }(myString, 5);
        

        应该是

        unichar c = [myString characterAtIndex:5];
        BOOL b = c == "w";
        

        如果您出于某种原因担心范围界定,请使用复合语句(将行括在大括号中)或 statement expression

        【讨论】:

          猜你喜欢
          • 2010-10-10
          • 2020-02-29
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 2019-06-14
          • 2019-10-11
          • 1970-01-01
          相关资源
          最近更新 更多