我想最初将CGPoint属性设置为特定点(屏幕中间)。其他方法可能随后希望更改此属性。我的想法是在getter中将其初始化为空,但是我得到消息无效的参数类型'struct CGPoint'到一元表达式。我也试过使用if property == nil或0但没有欢乐。
有什么想法吗?
-(CGPoint)graphOrigin
{
// initialise to centre of screen if has not been set
if(!_graphOrigin) // this expression is causing the problem
{
CGPoint origin = CGPointMake(self.bounds.origin.x + self.bounds.size.width / 2, self.bounds.origin.y + self.bounds.size.height / 2);
_graphOrigin = origin;
}
return _graphOrigin;
}
答案 0 :(得分:31)
CGPoint
是一个结构,因此您无法将其设置为nil或NULL(它不是指针)。从某种意义上说,真的没有“未初始化”的状态。也许您可以使用{0.0, 0.0}
来指定未设置的CGPoint
,但这也是一个有效的坐标。或者您可以使用负x
和y
值来标记“未初始化”的点,因为负值不能是有效的绘图点,但这也是一个黑客攻击。
可能你最好的选择是做两件事之一:
CGPoint
的指针。未初始化时,此值可以设置为NULL
。当然,您必须担心malloc
和free
价值。将CGPoint
与名为BOOL
的{{1}}或其他人pointInitialized
一起存储,最初设置为NO
,但一旦设置为YES
,则设置为struct {
CGPoint point;
BOOL initialized;
} pointData;
已初始化。你甚至可以将它包装在一个结构中:
{{1}}
答案 1 :(得分:21)
更简单的方法是将_graphOrigin初始化为CGRectZero并为此更改if语句:
if (!CGPointEqualToPoint(_graphOrigin, CGPointZero)) {
}
答案 2 :(得分:11)
CGPoint没有未初始化状态。但是,如果将点(0,0)视为未初始化,则可以使用
if (_graphOrigin.x == 0 && _graphOrigin.y == 0)
{
...
这是有效的,因为在初始化Objective-C实例时,其所有ivar都被清除为零位,在CGFloat表示中为0.0。
(注意:即使操作数是CGFloat,==
也没问题,因为我们想要与精确的位模式进行比较(忽略-0的问题))
答案 3 :(得分:5)
由于您的上下文中可能存在CGPointZero(0,0)和任何其他值 您可能希望使用以下内容初始化NSValue:
NSValue *pointVal = [NSValue valueWithCGPoint:point];
您可以根据某些条件执行此操作,然后稍后测试NSValue为零。 NSValue也可以添加到一个数组中,这样你就可以得到一个点数组。
稍后要简单地使用:
CGPoint point = [pointVal CGPointValue];
答案 4 :(得分:0)
创建两个CGPoint属性,这样他们都是"未初始化"。设置其中一个并使用第二个来检查它们是否相等。
@interface ClassName ()
@property (nonatomic) CGPoint point1;
@property (nonatomic) CGPoint point2;
@end
@implementation ClassName
self.point1 = CGPointMake(69.0f, 180.0f); //arbitrary numbers
//if not equal, then if statement proceeds
if (!CGPointEqualToPoint(self.point1, self.point2) {
//your code here
}
@end
如果您考虑这种方式,那么请尽快。而且我知道你的问题已经得到了回答,但在我想到这一点之前,我遇到了同样的困境。
答案 5 :(得分:0)
static CGPoint kInvalidPoint = {.x = NSIntegerMax, .y = NSIntegerMax};
@implementation MyClass
- init()
{
self = [super init];
if (self) {
_oldPoint = kInvalidPoint;
}
return self;
}
- (void)foo
{
if (CGPointEqualToPoint(self.oldPoint, kInvalidPoint)) {
// Invalid point.
return;
}
}
@end