Ios 为什么(self.window)在下面的代码中是一个条件?
为什么Ios 为什么(self.window)在下面的代码中是一个条件?,ios,objective-c,Ios,Objective C,为什么(self.window)处于以下代码状态 -(void)beginRefreshing { [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.alpha = 1.0; }]; self.pullingPercent =
(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];
}
}
某些变量是布尔值,这意味着它们可以等于true或false。其他人可以有广泛的价值观。例如,如果一个整数等于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
) 在这种情况下:
if (self.window) {
这是一个简短的版本
if (self.window != nil) {
测试视图(
UIView
实例)是否在任何窗口的视图层次结构中,也就是说,视图是否显示在屏幕上。我决定将我的注释扩展为答案,以供将来参考
这实际上是一种副作用。因为false定义为
0
,而true定义为与0
不同的任何内容。一个有效的对象地址是非零的,因此它被视为true,而由于ARC,nil==0
。您可以通过打印此NSLog(@“%p”,nil)
来检查这一点。请记住,对于整数,这意味着负值的计算结果也为真
还值得注意的是,由于布尔值的底层存储很少是一位,因此当someBool==true时,someBool==1
可能并不总是真的。这意味着走这样一条捷径:
- (NSInteger)increment:(NSInteger)toIncrement ifTrue:(BOOL)condition {
return toIncrement + condition;
}
可能并不总是导致toIncrement
增加1
。代码有效,因为BOOL
将自动升级为整数
这当然是边缘情况,但仍然有可能。Context?这是什么类?从UIView继承的UITableView RefreshComponent检查的目的是查看视图是否在视图层次结构中,您可以通过阅读UIView
的window
属性的类引用来找到它。请注意self.window
是指针,而不是布尔值。只是当在if
语句的上下文中使用时,if(self.window)
等同于if(self.window!=nil)
no,我同意它的计算结果是布尔值。我主要是为OP澄清,虽然在这个特定的上下文中它的计算结果是布尔值,但变量本身不是布尔类型;这是一个指针。例如,您不能通过说self.window=true来分配它代码>,比较if(self.window)
是if(self.window!=nil)
,而不是if(self.window==true)
这实际上是一个副作用,对吧。因为false
被定义为0
,而true
被定义为与0
不同的任何内容。有效地址是非零的,它被视为true
,而由于ARC,nil==0
。您可以通过打印此NSLog(@“%p”,nil)
来检查这一点。请记住,对于整数,这意味着负值的计算结果也为true
。通过将其alpha
设置为0
,或者将其hidden
属性设置为YES
@Losiowaty,视图实际上是不可见的。我知道这一点。对于这个答案,我决定忽略它。Objective-C中的nil
值始终为零,但这与ARC无关。