MAC & IOSiOS 开发技术之经验总结篇iOS开发

语句内嵌表达式

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]) ,放到语句内嵌表达式中仍待讨论,毕竟不是节点的初始化代码。

上一篇下一篇

猜你喜欢

热点阅读