代码之家  ›  专栏  ›  技术社区  ›  combinatorial

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

  •  10
  • combinatorial  · 技术社区  · 12 年前

    我刚刚升级到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 回复  |  直到 12 年前
        1
  •  8
  •   adamwalz    12 年前

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

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

        2
  •  6
  •   zpasternack    12 年前

    该测试代码:

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

    …在Xcode 5.0.1(5A2034a)中编译得很好。在5.0.1中, XCTAssertEqual 计算结果为 _XCTPrimitiveAssertEqual ,这不是在做 != 。它将原语编码为 NSValue s通过 value:withObjCType: ,然后通过比较 isEqualToValue: .

    另一种选择是使用以下内容:

    XCTAssertTrue( NSEqualPoints( NSPointFromCGPoint( p1 ), NSPointFromCGPoint( p2) ), 
        @"Points not equal" );