enum AssertOp { case Equals case NotEquals } enum SimpleAssertOp { case NotNil case Nil } infix operator <=> { associativity left } /** Asserts that the left hand side equals the right hand side and returns the left hand side. */ func <=> (left : T?, right : (value :T?, op: AssertOp, file: StaticString, msg: String, line : UInt)) -> T? { switch right.op { case .Equals: XCTAssertEqual(left, right.value, right.msg, file: right.file, line: right.line) case .NotEquals: XCTAssertNotEqual(left, right.value, right.msg, file: right.file, line: right.line) } return left } func equals(value : T?, message : String = "", file : StaticString = #file, line : UInt = #line) -> (T?, AssertOp, StaticString, String, UInt) { return (value, .Equals, file, message, line) } func notEquals(value : T?, message : String = "", file : StaticString = #file, line : UInt = #line) -> (T?, AssertOp, StaticString, String, UInt) { return (value, .NotEquals, file, message, line) } func <=> (left : T?, right : (op: SimpleAssertOp, file: StaticString, msg: String, line : UInt)) -> T? { switch right.op { case .Nil: XCTAssertNil(left, right.msg, file: right.file, line: right.line) case .NotNil: XCTAssertNotNil(left, right.msg, file: right.file, line: right.line) } return left } func notNil(message : String = "", file : StaticString = #file, line : UInt = #line) -> (SimpleAssertOp, StaticString, String, UInt){ return (.NotNil, file, message, line) } func isNil(message : String = "", file : StaticString = #file, line : UInt = #line) -> (SimpleAssertOp, StaticString, String, UInt) { return (.Nil, file, message, line) }