Objective-C Declare vars con ({…})

Estaba buscando el código de lib de REMenu , y veo un vars declarado como wiht ({…}); .. parece algo como “cierre” al código evaluado perezoso … No sé … ¿Alguien me puede explicar?

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

Esta es una extensión de lenguaje C GNU (no estándar) llamada ” expresión de statement “. La syntax es compatible con gcc, clang y varios otros comstackdores .

Básicamente, le permite tratar un bloque arbitrario como una sola expresión, cuyo valor es el valor de la última statement en el bloque.

Esta extensión es principalmente útil es las definiciones de macro. En mi opinión, el código que citó en su pregunta (del método showFromRect:inView: en REMenu.m ) sería mejor si no usara expresiones de statement. En cambio, el código en esas expresiones de statement se debe factorizar en métodos separados. Por ejemplo:

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