我正在尝试检查我的属性getter中CGRect
是否为null
,如果是,则默认加载一个值,但是,在我的init方法中,当我使用该属性时,它所有值都返回零。
这是我的吸气者:
- (CGRect)frame
{
if(CGRectIsNull(_frame))
_frame = CGRectMake(0,0,60,60);
return _frame;
}
- (id)init
{
self = [super initWithFrame:self.frame];
if(self)
{
//do something
}
return self;
}
我不确定发生了什么,在哪里看。非常感谢任何帮助。
答案 0 :(得分:52)
创建类的实例时,即使在调用_frame
方法之前,init
实例变量也会自动初始化。由于_frame
是一个C结构(CGRect
),因此它的内存被清除为全零。这会导致CGRect
全部为零值。
CGRectNull
是一个特殊的非零CGRect
。因此,使用CGRectIsNull()
进行检查将永远不会成立。
使用CGRectIsEmpty
对此进行更合理的检查。
答案 1 :(得分:10)
尝试
- (CGRect)frame
{
if (CGRectIsEmpty(_frame))
_frame = CGRectMake(0,0,60,60);
return _frame;
}
答案 2 :(得分:1)
这是Swift 4的更新答案。您现在可以使用CGRect的isNull
布尔属性来检查CGRectNull:
let someRect = CGRect.null
print(someRect.isNull) // true
答案 3 :(得分:0)
首先,需要了解一个空矩形和一个宽度和高度为零的矩形是不同的。
在Swift 5.0及更高版本中-
要检查矩形是否为空-在矩形上使用WITH ord AS
(SELECT t1.VehicleId,
t1.EventTimestamp AS first,
t2.EventTimestamp AS last,
t1.EventId,
t2.EventValue,
ROW_NUMBER() OVER (PARTITION BY t1.VehicleId, t1.EventTimestamp, t1.EventId ORDER BY t1.EventTimestamp) AS rn
FROM #T1 AS t1
LEFT JOIN #T2 AS t2 ON t1.VehicleID = t2.VehicleID
AND t1.EventID = t2.EventID
AND t2.EventTimestamp > t1.EventTimestamp
LEFT JOIN #E AS e ON t1.EventId = e.EventId
AND t1.EventValue = e.FirstValue
AND t2.eventId = e.EventId
AND t2.EventValue = e.LastValue
)
SELECT VehicleId, first, last, EventId, EventValue,
DATEDIFF(second, first, last) AS EventDelay
FROM ord
WHERE rn = 1
属性。假设矩形变量的标识符为“ myFrame”。然后执行以下操作-
isNull
对于.zero(width = 0,height = 0)框架的矩形,请按照以下方式进行检查-
if !myFrame.isNull{
//do sth if the frame is not nul
}