2016-01-25 75 views
2
_labelView = ({ 
    UIView * labelView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, _midView.frame.size.width, _midView.frame.size.height)]; 
    for (int i = 0;i < titleArr.count ; i++) { 
     [labelView addSubview:[self returnLabel:titleArr[i] andFrame:CGRectMake(0, i*_height, self.frame.size.width, _height) andColor:[UIColor whiteColor]]]; 
    } 
    labelView; 
}); 

为什么“labelView”可以通过这个赋值?这种方便的含义是什么?

+0

'_labelView'的声明类型是什么? – dasblinkenlight

+0

我不确定它是否可以 – anhtu

+0

labelView不是什么,最后一行 – JokerV

回答

1

这是一个statement expression,用括号括起来的复合语句,用作表达式。以下是该模式的GCC说明:

圆括号中包含的复合语句可能会在GNU C中显示为表达式。这允许您在表达式中使用循环,开关和局部变量。

回想一下,复合语句是由大括号包围的语句序列;在这个构造中,圆括号围绕着大括号。例如:

({ int y = foo(); int z; 
    if (y > 0) z = y; 
    else z = - y; 
    z; }) 

是用于foo()绝对值的有效(虽然稍稍超过必要的复合物)的表达。

复合语句中的最后一项应该是一个表达式,后跟分号;这个子表达式的值作为整个构造的价值。 (如果你使用一些其他类型的语句最后的括号内,该结构的类型为void,因此没有有效的值。)

语句表达式最常见的用途是在#define宏(见GCC discussion)在这种情况之外并不常见。