为什么(self.window)在以下代码中是一个条件?

时间:2015-12-15 12:02:31

标签: ios objective-c

为什么以下代码中的(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];
      }
}

3 个答案:

答案 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将自动提升为整数。

这当然是一个边缘情况,但仍有可能。