2015-09-10 1 views
7

Учитывая следующий Swift класс:не XCTAssertEqual работает Equatable типов в Swift

class TestObject: NSObject { 
    let a: Int 

    init(a: Int) { 
     self.a = a 
     super.init() 
    } 
} 

func ==(lhs: TestObject, rhs: TestObject) -> Bool { 
    return lhs.a == rhs.a 
} 

и испытанием для него:

func testExample() { 
    let a = TestObject(a: 4) 
    let b = TestObject(a: 4) 

    XCTAssertEqual(a, b) // fails 

    let isEqual = a == b 
    XCTAssert(isEqual) // passes  
} 

Вернуть два Assert в разные значения, но они должны как пройти ,

Я пытался писать пользовательскую функцию утверждать, что:

func BAAssertEquatable<A: Equatable>(x1: A, _ x2: A, _ message: String, file: String = __FILE__, line: UInt = __LINE__) { 
    let operandsEqual = (x1 == x2) 
    XCTAssert(operandsEqual, message, file: file, line: line) 
} 

, но это также не:

BAAssertEquatable(a, b, "custom assert") // fails 

Что здесь происходит?

+0

+1 для очень хорошего анализа. К сожалению, я могу только догадаться об этой проблеме и рекомендовать дальнейший анализ. Для меня это выглядит так быстро, что теряет информацию о том, что ваш TestObject реализует Equatable Protocol. Не могли бы вы добавить «печать» в функцию «Оператор»? Я ожидаю, что он не будет вызван в рассматриваемых случаях. Кроме того, я ожидал бы «переопределить» как-то перед «func ==». Извините, что сейчас я не могу помочь. – jboi

+0

@jboi Вы правы - оператор == только вызывается один раз (в прямом вызове в testExample), но его следует вызывать три раза. Я не могу использовать ключевое слово override на верхнем уровне (это синтаксическая ошибка). – Bill

+0

Я думаю, что это связано с проблемой/проблемой здесь: http://stackoverflow.com/questions/31099379/bug-with-equals-operator-and-nsobjects-in-swift-2-0 – Bill

ответ

3

XCTAssertEqual звонки isEqual вместо ==, например. это сделает ваш пробный пропуск:

class TestObject: NSObject { 

    // ... 

    override func isEqual(object: AnyObject?) -> Bool { 
     guard let other = object as? TestObject else { return false } 
     return self == other 
    } 

}