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

Ios 在swift中,函数可以是类型吗?,ios,xcode,swift,function,generics,Ios,Xcode,Swift,Function,Generics,当通过按command+click来研究XCTAssert方法时,看起来它们的底层方法是一个具有类型的函数(一个称为T的泛型类型,符合Equalable协议)。我说的对吗?如果是的话,函数如何符合协议?函数类型是什么 public func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure () throws -> ArraySlice<T>, _ expression2: @autoclosure

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

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)
public-func-xctasertequal(\uexpression1:@autoclosure()throws->ArraySlice,\uexpression2:@autoclosure()throws->ArraySlice,\umessage:@autoclosure()->String=default,file:StaticString=\frie,line:UInt=\line)
这一行是我试图在上面解释的最令人困惑的:

func XCTAssertEqual<T : Equatable>`
func xctasertequal`

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

typealias FooType = (Int, String)->String

func foo(i: Int, s: String)->String {
    return s + "_\(i)"
}

func bar(foo0: FooType)->String {
    return foo0(100, "alpha")
}

print(bar(foo))         // alpha_100

let f:FooType = { i, s in
    return s + "_\(i)"
}

print(f(200, "beta"))   // beta_200
附录,特别是布兰登的附录:-)

附录2,布兰登

func f1()->Int {
    return 1
}
func f2()->Int {
    return 2
}

let farr2:[()->Int] = [f1, f2]
for f in farr2 {
    print(f())
/*
 1
 2
 */
}
附录3:-)

来自苹果文档

Swift中的每个函数都有一个类型,由函数的 参数类型和返回类型。您可以像其他类型一样使用此类型 键入Swift,这样可以很容易地将函数作为参数传递给 其他函数,以及从函数返回函数。功能可以 也可以在其他函数中编写,以封装有用的 嵌套函数范围内的功能


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

typealias FooType = (Int, String)->String

func foo(i: Int, s: String)->String {
    return s + "_\(i)"
}

func bar(foo0: FooType)->String {
    return foo0(100, "alpha")
}

print(bar(foo))         // alpha_100

let f:FooType = { i, s in
    return s + "_\(i)"
}

print(f(200, "beta"))   // beta_200
附录,特别是布兰登的附录:-)

附录2,布兰登

func f1()->Int {
    return 1
}
func f2()->Int {
    return 2
}

let farr2:[()->Int] = [f1, f2]
for f in farr2 {
    print(f())
/*
 1
 2
 */
}
附录3:-)

来自苹果文档

Swift中的每个函数都有一个类型,由函数的 参数类型和返回类型。您可以像其他类型一样使用此类型 键入Swift,这样可以很容易地将函数作为参数传递给 其他函数,以及从函数返回函数。功能可以 也可以在其他函数中编写,以封装有用的 嵌套函数范围内的功能


这只是一个带有泛型类型参数的“普通”函数。是的,函数有类型,例如
()->String
(Int,Double)->[UIView]
。否函数不能是类型。类型可以存储。功能不能。可以存储块。功能不能。可以存储指向函数的指针,但不能存储函数本身。例如,我可以存储一个结构。我不能用函数来做这件事。我只能存储指向它的指针。也没有通用函数指针(Swift中没有)。因此,不能将函数指针存储为AnyObject或Any。您可以将Objective-C函数块对任何对象进行位转换并存储它,但您没有存储函数。您正在存储一个包含函数指针的NSMallocBlock。在swift中,您可以创建一个包含类型T的通用包装器对象,以及调用任何函数的store和block。当然,您必须将它转换回正确的类型。@Brandon,请参阅我的回答的附录,它只是一个带有泛型类型参数的“普通”函数。是的,函数有类型,例如
()->String
(Int,Double)->[UIView]
。否函数不能是类型。类型可以存储。功能不能。可以存储块。功能不能。可以存储指向函数的指针,但不能存储函数本身。例如,我可以存储一个结构。我不能用函数来做这件事。我只能存储指向它的指针。也没有通用函数指针(Swift中没有)。因此,不能将函数指针存储为AnyObject或Any。您可以将Objective-C函数块对任何对象进行位转换并存储它,但您没有存储函数。您正在存储一个包含函数指针的NSMallocBlock。在swift中,您可以创建一个包含类型T的通用包装器对象,以及调用任何函数的store和block。“你当然得把它改回正确的类型。”布兰登,请看我答案的附录什么?那些是街区。。它们的每个底层类型都是NSBlock@斯威夫特的布兰登,我们没有街区。--你在开玩笑吗?将其传递给Objective-C桥接函数并打印其类型。那就告诉我斯威夫特没有障碍物。@Brandon不,我没有。请查看苹果的文档。你显然不认识斯威夫特。不,上面说斯威夫特没有障碍物。我刚刚传递了一个swift函数作为块。我还创建了一个块。我还在swift中创建了Objective-C块。所有块示例都在上面。不能在数组中存储函数。他们不是类型。什么?那些是街区。。它们的每个底层类型都是NSBlock@斯威夫特的布兰登,我们没有街区。--你在开玩笑吗?将其传递给Objective-C桥接函数并打印其类型。那就告诉我斯威夫特没有障碍物。@Brandon不,我没有。请查看苹果的文档。你显然不认识斯威夫特。不,上面说斯威夫特没有障碍物。我刚刚传递了一个swift函数作为块。我还创建了一个块。我还在swift中创建了Objective-C块。所有块示例都在上面。不能在数组中存储函数。它们不是类型。