是否可以在同一个函数中调用不同的重载函数?
Is it possible to call a different overloaded function in the same function?
我正在尝试为 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.", file: file, line: line)
}
func XCTAssertFalse(_ expression: Bool?, _ message: String = "", file: StaticString = #file, line: UInt = #line) {
if let unwrapped = expression {
XCTAssertFalse(unwrapped, message, file: file, line: line)
}
XCTFail("It was nil.", file: file, line: line)
}
}
问题是它调用自己而不是 other XCTAssertTrue,后者具有不同的参数。但为什么不能区分呢?
我可以通过将它们重命名为类似 XCTAssertOptionalTrue 的名称来修复它,但我希望它们具有相同的名称以便于使用。这可能吗?
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)
失败时,这会报告失败值。在这种情况下,报告会告诉我们实际值是 false 还是 nil。
你不能写重载,因为这是 Objective C 的底层,所以没有重载!不管怎样,你在这里做的工作方式太多了。目标显然是:“给定一个 Optional Bool,如果为 nil 则失败,否则展开并断言 true 或 false”。表达方式是:
XCTAssertTrue(try XCTUnwrap(thing?.isValid)) // or XCTAssertFalse
请注意,这假定您的 test...
函数是 throws
函数。好吧,如果不是,那应该是! test...
函数的抛出能力是一个非常重要的特性; throwing 导致测试立即失败,这正是您想要的。
我正在尝试为 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.", file: file, line: line)
}
func XCTAssertFalse(_ expression: Bool?, _ message: String = "", file: StaticString = #file, line: UInt = #line) {
if let unwrapped = expression {
XCTAssertFalse(unwrapped, message, file: file, line: line)
}
XCTFail("It was nil.", file: file, line: line)
}
}
问题是它调用自己而不是 other XCTAssertTrue,后者具有不同的参数。但为什么不能区分呢?
我可以通过将它们重命名为类似 XCTAssertOptionalTrue 的名称来修复它,但我希望它们具有相同的名称以便于使用。这可能吗?
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)
失败时,这会报告失败值。在这种情况下,报告会告诉我们实际值是 false 还是 nil。
你不能写重载,因为这是 Objective C 的底层,所以没有重载!不管怎样,你在这里做的工作方式太多了。目标显然是:“给定一个 Optional Bool,如果为 nil 则失败,否则展开并断言 true 或 false”。表达方式是:
XCTAssertTrue(try XCTUnwrap(thing?.isValid)) // or XCTAssertFalse
请注意,这假定您的 test...
函数是 throws
函数。好吧,如果不是,那应该是! test...
函数的抛出能力是一个非常重要的特性; throwing 导致测试立即失败,这正是您想要的。