披露,这是我撰写任何Swift的第一天,我来自JS / TS背景。
我习惯于简单地重新分配功能,如下所示:
let assertEqual = XCTAssertEqual
XCTAssertEqual具有以下声明:
func XCTAssertEqual<T>(_ expression1: @autoclosure () throws -> T, _ expression2: @autoclosure () throws -> T, accuracy: T, _ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) where T : FloatingPoint
快速操场引发以下错误:
Generic parameter 'T' could not be inferred
我意识到这种分配并不是特别“有价值”,但是将来我可能想用通用类型参数为其他函数添加别名,并且想了解有关Swift特定约定的更多信息。
该错误消息非常清楚您在此处需要执行的操作-告诉编译器T
应该是什么类型。不幸的是,您不能有一个带有unbound的“泛型变量” T
。
为此,您需要写出函数的完整类型名称XCTAssertEquals<T>
,对于而言T == Double
,它是:
(@autoclosure () throws -> Double, @autoclosure () throws -> Double, Double, @autoclosure () -> String, StaticString, UInt) -> ()
因此,您需要:
let assertEqual: (@autoclosure () throws -> Double, @autoclosure () throws -> Double, Double, @autoclosure () -> String, StaticString, UInt) -> () = XCTAssertEqual
我知道,那是一团糟。因此,如果要对各种T
s执行此操作,则可以首先为长函数名创建类型别名:
typealias XCTAssertEqualsType<T> = (@autoclosure () throws -> T, @autoclosure () throws -> T, T, @autoclosure () -> String, StaticString, UInt) -> ()
然后你可以用XCTAssertEqualsType<Double>
和XCTAssertEqualsType<Float>
等。
但老实说,我不明白为什么要为此断言函数起别名。您会失去很多功能。如果通过变量进行调用,则必须手动输入文件名和行号“ magic”参数。您将丢失所有可选参数,并且正如我在开始时所说的那样,您将丢失泛型。
如果您想要的只是函数的其他名称,则可以自己声明另一个函数:
func anotherName<T>(_ expression1: @autoclosure () throws -> T, _ expression2: @autoclosure () throws -> T, accuracy: T, _ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) where T : FloatingPoint {
XCTAssertEqual(try expression1(), try expression2(), accuracy: accuracy, message(), file: file, line: line)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句