在 swift 中,函数可以是类型吗?

Cos*_*ows 0 generics xcode function ios swift

在通过按 command+click 研究 XCTAssert 方法时,看起来它们的底层方法是一个具有类型的函数(称为 T 的通用类型,符合 Equatable 协议)。我说得对吗?如果是的话,函数如何遵守协议?函数是类型吗?

public func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure () throws -> ArraySlice<T>, _ expression2: @autoclosure () throws -> ArraySlice<T>, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
Run Code Online (Sandbox Code Playgroud)

这行是最令人困惑的,我在上面试图解释:

func XCTAssertEqual<T : Equatable>`
Run Code Online (Sandbox Code Playgroud)

use*_*734 5

每个函数都有一个特定的函数类型,由函数的参数类型和返回类型组成。

\n\n
typealias FooType = (Int, String)->String\n\nfunc foo(i: Int, s: String)->String {\n    return s + "_\\(i)"\n}\n\nfunc bar(foo0: FooType)->String {\n    return foo0(100, "alpha")\n}\n\nprint(bar(foo))         // alpha_100\n\nlet f:FooType = { i, s in\n    return s + "_\\(i)"\n}\n\nprint(f(200, "beta"))   // beta_200\n
Run Code Online (Sandbox Code Playgroud)\n\n

附录,特别是布兰登的:-)

\n\n
let farr:[()->Int] = [{return 1}, {return 2}, {return 3}]\nfor f in farr {\n    print(f())\n/*\n 1\n 2\n 3\n*/\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

附录 2,布兰登

\n\n
func f1()->Int {\n    return 1\n}\nfunc f2()->Int {\n    return 2\n}\n\nlet farr2:[()->Int] = [f1, f2]\nfor f in farr2 {\n    print(f())\n/*\n 1\n 2\n */\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用程序 3 :-)

\n\n
let farr2 = [f1, f2]\nfor f in farr2 {\n    print(f())\n/*\n 1\n 2\n */\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自苹果文档

\n\n
\n

Swift 中的每个函数都有一个类型,由 function\xe2\x80\x99s\n 参数类型和返回类型组成。您可以像 Swift 中的任何其他类型一样使用此类型,这样可以轻松地将函数作为参数传递给其他函数,以及从函数返回函数。函数也可以编写在其他函数中,以将有用的功能封装在嵌套函数作用域内。

\n
\n