Objective-C Declare vars with ({ ... })
ios, objective-c
Solution
This is a GNU (non-standard) C language extension called a “statement expression”. The syntax is supported by gcc, clang, and several other compilers.
Basically, it lets you treat an arbitrary block as a single expression, whose value is the value of the last statement in the block.
This extension is mostly useful is macro definitions. In my opinion, the code you quoted in your question (from the `showFromRect:inView:` method in `REMenu.m`) would be better if it did not use statement expressions. Instead, the code in those statement expressions should be factored out into separate methods. For example:
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;
}
Problem
Im was looking the REMenu lib code, and see a vars being declared as wiht ({ ... }); .. looks something like 'closure' to lazy evaluated code.. I don't know.. Someone can explain me? ``` 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; }); ```