语句内嵌表达式
2016-07-01 本文已影响87人
Jeffery91
C系语言中在方法内部可以通过添加任意成对的 {} 来限定代码的作用范围。这样做一般有两个好处,首先是超过作用域的临时变量就会失效,使方法内的命名更加容易,也使得那些不被需要的引用的回收提前进行;其次插入括号有利于方法的梳理,对于那些不太方便提取为一个单独方法,但是又应该和当前方法内的其它部分进行区分的代码,使用大括号可以进行自然的划分。
在使用代码布局的实践中,一般在初始化中生成页面节点树,在 layoutSubviews 方法中就行布局。初始化中会有下面这样的代码:
_lbTitle = [[UILabel alloc] initWithFrame:CGRectZero];
_lbTitle.backgroundColor = [UIColor clearColor];
_lbTitle.textAlignment = NSTextAlignmentLeft;
_lbTitle.font = [UIFont systemFontOfSize:15];
[self.contentView addSubview:_lbTitle];
_lbContent = [[UILabel alloc] initWithFrame:CGRectZero];
_lbContent.font = [UIFont systemFontOfSize:14];
_lbContent.textAlignment = NSTextAlignmentLeft;
_lbContent.numberOfLines = 3;
_lbContent.lineBreakMode = NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail;
[self.contentView addSubview:_lbContent];
_lbTime = [[UILabel alloc] initWithFrame:CGRectZero];
_lbTime.backgroundColor = [UIColor clearColor];
_lbTime.font = [UIFont systemFontOfSize:12];
_lbTime.textColor = [UIColor grayColor];
_lbTime.textAlignment = NSTextAlignmentRight;
[self.contentView addSubview:_lbTime];
这仅仅是生成了3个页面节点,真实的页面会比这复杂。如果在上面的代码中把配置 _lbTime 的代码写成了 _lbTitle ,编译器不会报错,这样的bug会很难发现。因此在这种代码一大堆但是又不太可能进行重用的时候,推荐使用局部scope将他们分隔开来。示例如下:
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.textAlignment = NSTextAlignmentLeft;
label.font = [UIFont systemFontOfSize:15];
[self.contentView addSubview:label];
_lbTitle = label;
}
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.font = [UIFont systemFontOfSize:14];
label.textAlignment = NSTextAlignmentLeft;
label.numberOfLines = 3;
label.lineBreakMode = NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail;
[self.contentView addSubview:label];
_lbContent = label;
}
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont systemFontOfSize:12];
label.textColor = [UIColor grayColor];
label.textAlignment = NSTextAlignmentRight;
[self.contentView addSubview:label];
_lbTime = label;
}
这样会很少发生节点配置错误的情况了,及时发生也易于发现,我们可以更专注于每个代码块。
语句内嵌表达式是GNU C的声明扩展 https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html ,它可以通过表达式来限制局部作用域,同时进行赋值,运用后,代码变得更加紧凑和整洁。
_lbTitle = ({
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.textAlignment = NSTextAlignmentLeft;
label.font = [UIFont systemFontOfSize:15];
[self.contentView addSubview:label];
label;
});
_lbContent = ({
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.font = [UIFont systemFontOfSize:14];
label.textAlignment = NSTextAlignmentLeft;
label.numberOfLines = 3;
label.lineBreakMode = NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail;
[self.contentView addSubview:label];
label;
});
_lbTime = ({
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont systemFontOfSize:12];
label.textColor = [UIColor grayColor];
label.textAlignment = NSTextAlignmentRight;
[self.contentView addSubview:label];
label;
});
以上代码中,是否将节点加入节点树中的代码 ([self.contentView addSubview:label]) ,放到语句内嵌表达式中仍待讨论,毕竟不是节点的初始化代码。