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

com*_*ial 10 xcode ios xctest

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

CGPoint p1 = CGPointMake(1,2);
CGPoint p2 = CGPointMake(2,3);
XCTAssertEqual(p1, p2, @"Points not equal");
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

Invalid operands to binary expression ('typeof (p1)' (aka 'struct CGPoint') and 'typeof (p2)' (aka 'struct CGPoint'))
Run Code Online (Sandbox Code Playgroud)

在以前版本的XCode中使用相同的代码.代码是否不正确,或者这是最新XCode中的错误?

更新

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

更新2

代码也可以通过更改来修复

XCTAssertEqualObjects([NSValue valueWithCGPoint:p1],
                      [NSValue valueWithCGPoint:p2],
                      @"Points not equal");
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

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


zpa*_*ack 6

那个测试代码:

XCTAssertEqual(p1, p2, @"Points not equal"); ) 
Run Code Online (Sandbox Code Playgroud)

...绝对可以在Xcode 5.0.1(5A2034a)中编译好.在5.0.1中,XCTAssertEqual求值为_XCTPrimitiveAssertEqual,不执行a !=.它将原语编码为NSValues via value:withObjCType:,然后比较via isEqualToValue:.

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

XCTAssertTrue( NSEqualPoints( NSPointFromCGPoint( p1 ), NSPointFromCGPoint( p2) ), 
    @"Points not equal" );
Run Code Online (Sandbox Code Playgroud)

  • 更简单的选项:`XCTAssertTrue(CGPointEqualToPoint(p1,p2),@"点不相等"); (7认同)