在Xcode 5.1中使用XCTAssertEqual比较CGPoint时出错

时间:2014-03-10 22:00:58

标签: ios xcode xctest

我刚刚升级到XCode 5.1,在我的单元测试中看到编译错误,代码如下:

CGPoint p1 = CGPointMake(1,2);
CGPoint p2 = CGPointMake(2,3);
XCTAssertEqual(p1, p2, @"Points not equal");

这是错误消息:

Invalid operands to binary expression ('typeof (p1)' (aka 'struct CGPoint') and 'typeof (p2)' (aka 'struct CGPoint'))

相同的代码在以前的XCode版本中有效。代码是不正确的,还是最新的XCode中的错误?

更新

错误是由XCTAssertEqual宏在两个变量上执行!=触发的。由于这些是结构,这是不允许的。宏是否从5.0更改为5.1,或者编译器是否允许比较之前的结构?

更新2

可以通过更改

来修复代码
XCTAssertEqualObjects([NSValue valueWithCGPoint:p1],
                      [NSValue valueWithCGPoint:p2],
                      @"Points not equal");

我仍然想知道导致这种情况失败的原因。 (不幸的是,旧版本的xcode通过安装新版本而被删除。)

2 个答案:

答案 0 :(得分:7)

在Xcode 5.1中更改了此宏的功能,以允许比较标量值,但删除对非标量类型(如struct CGPoint)的支持。

从发行说明中 XCTAssertEqual宏(以前使用OCUnit的STAssertEquals)正确地比较不同类型的标量值而不进行强制转换,例如int和NSInteger。它不能再接受非标量类型,例如结构,以进行比较。 (14435933)

答案 1 :(得分:6)

该测试代码:

XCTAssertEqual(p1, p2, @"Points not equal"); ) 

...绝对可以在Xcode 5.0.1(5A2034a)中编译好。在5.0.1中,XCTAssertEqual评估为_XCTPrimitiveAssertEqual,而!=未执行NSValue。它通过value:withObjCType:将基元编码为isEqualToValue:,然后通过XCTAssertTrue( NSEqualPoints( NSPointFromCGPoint( p1 ), NSPointFromCGPoint( p2) ), @"Points not equal" ); 进行比较。

另一种选择是使用类似的东西:

{{1}}