2015-09-10 10 views
7

Data la seguente classe Swift:non XCTAssertEqual lavorare per tipi equatable in 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 
} 

e un test per esso:

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

    XCTAssertEqual(a, b) // fails 

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

ritorno due del asserzione valori differenti, ma entrambi dovrebbero passaggio .

ho provato a scrivere una funzione assert personalizzato:

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) 
} 

ma questo viene a mancare anche:

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

cosa sta succedendo qui?

+0

+1 per l'ottima analisi. Purtroppo posso solo indovinare il problema e raccomandare ulteriori analisi. Per me sembra che swift da qualche parte perda le informazioni che il tuo 'TestObject' implementa il Protocollo Equitable. Potresti aggiungere una "stampa" al tuo operatore func? Mi aspetto che non venga chiamato nei casi in questione. Inoltre mi aspetterei un 'override' in qualche modo di fronte a 'func =='. Mi dispiace di non poter aiutare meglio al momento. – jboi

+0

@jboi Hai ragione - l'operatore == viene chiamato una sola volta (nella chiamata diretta in testExample), ma dovrebbe essere chiamato tre volte. Non riesco a utilizzare la parola chiave override al livello più alto (si tratta di un errore di sintassi). – Bill

+0

Penso che questo sia correlato al bug/problema qui: http://stackoverflow.com/questions/31099379/bug-with-equals-operator-and-nsobjects-in-swift-2-0 – Bill

risposta

3

XCTAssertEqual chiamate isEqual anziché ==, ad es. questo farà passare il test:

class TestObject: NSObject { 

    // ... 

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

} 
Problemi correlati