是否可以在同一函数中调用不同的重载函数?

问题描述

我正在尝试为XCTestCase写一个简单的扩展,以便在检查true或false时不必解开所有包装。就像普通的XCTAssertTrue一样,但是取而代之的是Bool?。 (XCTAssertEqual具有可选参数,所以奇怪的是没有此选项)

// Currently have this
XCTAssertTrue(thing?.isValid ?? false)
XCTAssertFalse(thing?.isValid ?? true)

// I want this to work on optionals
XCTAssertTrue(thing?.isValid)
XCTAssertFalse(thing?.isValid)
extension XCTestCase {
    func XCTAssertTrue(_ expression: Bool?,_ message: String = "",file: StaticString = #file,line: UInt = #line) {
        if let unwrapped = expression {
            XCTAssertTrue(unwrapped,message,file: file,line: line)
        }
        XCTFail("It was nil.",line: line)
    }
    
    func XCTAssertFalse(_ expression: Bool?,line: UInt = #line) {
        if let unwrapped = expression {
            XCTAssertFalse(unwrapped,line: line)
    }
}

问题是它自己调用而不是 other XCTAssertTrue,后者具有不同的参数。但是为什么不能分辨出差异呢?

我可以通过将它们重命名为XCTAssertOptionalTrue之类的方法来修复它,但是我希望它们具有相同的名称,以易于使用。这可能吗?

解决方法

您不能编写重载,因为这是目标C,所以没有重载!无论如何,您在这里做 way 的工作太多了。目标显然是:“给出一个可选的布尔值,如果为零则失败,否则解包并断言是对还是错”。这样说是:

XCTAssertTrue(try XCTUnwrap(thing?.isValid)) // or XCTAssertFalse

观察到这假设您的test...函数是throws函数。好吧,如果不是,应该是! test...函数的抛出能力是非常重要的功能;抛出会导致测试立即失败,这正是您想要的。

,

XCTest断言不再是方法。它们是我们可以从任何地方调用的独立功能。这使编写辅助断言变得更加容易,因为它们不再需要对象。

// No extension. And don't name them XCT,they're not in XCTest.
func assertMyThing(thing: Thing,file: StaticString = #file,line: UInt = #line) {
   // …
}

就您而言,根本没有必要。要检查可选Bool的值,请使用注释中显示的@dasdom:使用XCTAssertEqual。

XCTAssertEqual(thing?.isValid,true)

失败时,将报告失败值。在这种情况下,报告将告诉我们实际值是假还是零。