Objective-C用({…})声明variables

我正在看REMENU的lib代码,看到一个variables被声明为wiht ({…}); ..看起来像'封闭'懒惰评估的代码..我不知道..有人可以解释我?

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; }); 

这是一个名为“ 语句expression式 ”的GNU(非标准)C语言扩展。 语法是由gcc,clang和其他几个编译器支持的 。

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

这个扩展最有用的是macros定义。 在我看来,如果你没有使用语句expression式,你在你的问题中引用的代码(来自showFromRect:inView:方法)会更好。 相反,这些语句expression式中的代码应该分解成单独的方法。 例如:

  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; }