2013-11-01 67 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