2013-11-01 66 views
15

我正在寻找REMenu lib的代码,并看到一个变量声明为({...}); ..看起来像'封闭'懒惰评估代码..我不知道..有人可以解释我?Objective-C声明变量({...})

self.menuWrapperView = ({ 
     UIView *view = [[UIView alloc] init]; 
     view.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     if (!self.liveBlur || !REUIKitIsFlatMode()) { 
      view.layer.shadowColor = self.shadowColor.CGColor; 
      view.layer.shadowOffset = self.shadowOffset; 
      view.layer.shadowOpacity = self.shadowOpacity; 
      view.layer.shadowRadius = self.shadowRadius; 
      view.layer.shouldRasterize = YES; 
      view.layer.rasterizationScale = [UIScreen mainScreen].scale; 
     } 
     view; 
    }); 

    self.toolbar = ({ 
     UIToolbar *toolbar = [[UIToolbar alloc] init]; 
     toolbar.barStyle = self.liveBlurBackgroundStyle; 
     if ([toolbar respondsToSelector:@selector(setBarTintColor:)]) 
      [toolbar performSelector:@selector(setBarTintColor:) withObject:self.liveBlurTintColor]; 
     toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     toolbar; 
    }); 

回答

22

这是称为“statement expression”的GNU(非标准)C语言扩展。该语法由gcc,clang和several other compilers支持。

基本上,它允许您将任意块​​视为单个表达式,其值是该块中最后一条语句的值。

此扩展功能最为有用的是宏定义。在我看来,你在你的问题中引用的代码(来自REMenu.m中的showFromRect:inView:方法)会更好,如果它使用语句表达式而不是。相反,这些语句表达式中的代码应该分解成单独的方法。例如:

self.menuWrapperView = [self newMenuWrapperView]; 
    self.toolbar = [self newToolbar]; 

... 

- (UIView *)newMenuWrapperView { 
    UIView *view = [[UIView alloc] init]; 
    view.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
    if (!self.liveBlur || !REUIKitIsFlatMode()) { 
     view.layer.shadowColor = self.shadowColor.CGColor; 
     view.layer.shadowOffset = self.shadowOffset; 
     view.layer.shadowOpacity = self.shadowOpacity; 
     view.layer.shadowRadius = self.shadowRadius; 
     view.layer.shouldRasterize = YES; 
     view.layer.rasterizationScale = [UIScreen mainScreen].scale; 
    } 
    return view; 
} 

- (UIToolbar *)newToolbar { 
    UIToolbar *toolbar = [[UIToolbar alloc] init]; 
    toolbar.barStyle = self.liveBlurBackgroundStyle; 
    if ([toolbar respondsToSelector:@selector(setBarTintColor:)]) 
     [toolbar performSelector:@selector(setBarTintColor:) withObject:self.liveBlurTintColor]; 
    toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
    return toolbar; 
} 
+0

不错@rob,谢谢。然后,我相信在这种情况下,单个好处是组初始化代码。没有? – seufagner

+0

这很红宝石般,很高兴知道这件事,谢谢Rob。 +1 –

+2

我努力不想这样,但它在我身上越来越大。 @seufagner正确的 - 它有效地说* _menuWrapperView ivar是通过这个自包含的代码块来初始化的,不多不少*。它肯定会使重构更容易(只需抓取任务+整个范围,剪切...滚动...粘贴)。它也很可读。后面的“视图”看起来有点奇怪,但我敢打赌,如果编译器被忽略,编译器会大声抱怨。 – bbum