我刚刚升级到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)
那个测试代码:
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)