Objective-C用({...})声明变量 [英] Objective-C Declare vars with ({ ... })

查看:113
本文介绍了Objective-C用({...})声明变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找 REMenu lib 代码,并看到vars被声明为( {...}); ..对于延迟评估的代码看起来像'封闭'......我不知道..有人可以解释一下吗?

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

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


解决方案

这是一种GNU(非标准)C语言扩展称为声明表达。语法由gcc,clang和其他几个编译器支持。

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



此扩展主要用于宏定义。在我看来,你在问题中引用的代码(来自 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;
}
返回视图;
}

- (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;
返回工具栏;
}


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

解决方案

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

这篇关于Objective-C用({...})声明变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆