为什么以下代码中的(self.window)
成为条件?
-(void)beginRefreshing {
[UIView animateWithDuration:MJRefreshFastAnimationDuration
animations:^{
self.alpha = 1.0;
}];
self.pullingPercent = 1.0;
if (self.window) {
self.state = MJRefreshStateRefreshing;
} else {
self.state = MJRefreshStateWillRefresh;
[self setNeedsDisplay];
}
}
答案 0 :(得分:1)
在这种情况下:
if (self.window) {
是
的简短版本if (self.window != nil) {
是测试视图(UIView
实例)是否在任何窗口的视图层次结构中,即视图是否显示在屏幕上。
答案 1 :(得分:0)
某些变量是布尔值,意味着它们可以等于true或false。其他人可以拥有广泛的价值观。例如,如果你想写一个Integer等于5,你想做某事:
if (myInt == 5) {
//do something
}
如果你的变量是布尔值,那么只有两个选项,所以我们可以编写更短的选项:
if (myBoolean) {
//case where myBoolean = true
} else {
//case where myBoolean = false
}
在您的特定示例中,self.window
按以下方式求值为布尔值:自视窗层次中是否存在self.windows(self.windows == true
)或不存在(self.windows == false
)。
答案 2 :(得分:0)
我已决定将我的评论扩展到答案以供将来参考。
它实际上是副作用,AFAIK。因为false定义为0
,而true定义为与0
不同的任何内容。有效的对象地址不为零,因此它被视为true,而由于ARC,nil == 0
。您可以通过打印此NSLog(@"%p", nil)
来查看此内容。请记住,对于整数,这意味着负值,也会评估为真
值得注意的是,因为boolean
的底层存储很少是一位,所以when someBool == true, then someBool == 1
可能并非总是如此。这意味着采取这样的捷径:
- (NSInteger)increment:(NSInteger)toIncrement ifTrue:(BOOL)condition {
return toIncrement + condition;
}
可能并不总是导致toIncrement
增加1
。该代码有效,因为BOOL
将自动提升为整数。
这当然是一个边缘情况,但仍有可能。