開示、これは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
ください。残念ながら、バインドされていない「一般変数」を持つことはできません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
実行する場合は、最初に長い関数名の型エイリアスを実行できます。
typealias XCTAssertEqualsType<T> = (@autoclosure () throws -> T, @autoclosure () throws -> T, T, @autoclosure () -> String, StaticString, UInt) -> ()
そして、あなたは使用することができますXCTAssertEqualsType<Double>
し、XCTAssertEqualsType<Float>
など
しかし、正直なところ、このアサート関数のエイリアスを作成する理由がわかりません。関数としての機能の多くが失われます。変数を介して呼び出す場合は、ファイル名と行番号の「マジック」パラメーターを手動で渡す必要があります。オプションの引数はすべて失われ、冒頭で述べたように、ジェネリックは失われます。
関数の名前が違うだけの場合は、自分で別の関数を宣言するだけです。
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]
コメントを追加