Ios 在swift中,函数可以是类型吗?
当通过按command+click来研究XCTAssert方法时,看起来它们的底层方法是一个具有类型的函数(一个称为T的泛型类型,符合Equalable协议)。我说的对吗?如果是的话,函数如何符合协议?函数类型是什么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
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块。所有块示例都在上面。不能在数组中存储函数。它们不是类型。