【问题标题】:In swift, can a function be a type?快速,函数可以是类型吗?
【发布时间】:2016-07-09 19:42:57
【问题描述】:

在通过按 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)

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

func XCTAssertEqual<T : Equatable>`

【问题讨论】:

  • 这只是一个带有泛型类型参数的“普通”函数。是的,函数类型,例如() -&gt; String(Int, Double) -&gt; [UIView]
  • 没有函数不能是类型。可以存储类型。函数不能。可以存储块。函数不能。您可以存储指向函数的指针,但不能存储函数本身。例如,我可以存储一个结构。我不能用函数来做到这一点。我只能存储一个指向它的指针。也没有通用函数指针(不是在 Swift 中)。因此,您不能将函数指针存储为 AnyObject 或 Any。您可以将 Objective-C 功能块 BitCast 到 AnyObject 并存储它,但您不存储函数。您正在存储一个包含指向函数的指针的 N​​SMallocBlock。
  • 在 swift 中,您可以创建一个通用的包装器对象,该对象包含类型 T 以及调用任何函数的存储和块。当然,您必须将其转换回正确的类型。
  • @Brandon 请参阅我的答案的附录

标签: ios xcode swift function generics


【解决方案1】:

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

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

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

let farr:[()->Int] = [{return 1}, {return 2}, {return 3}]
for f in farr {
    print(f())
/*
 1
 2
 3
*/
}

附录 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 :-)

let farr2 = [f1, f2]
for f in farr2 {
    print(f())
/*
 1
 2
 */
}

来自苹果文档

Swift 中的每个函数都有一个类型,由函数的 参数类型和返回类型。您可以像使用其他任何类型一样使用此类型 在 Swift 中输入,这使得将函数作为参数传递给 其他函数,并从函数返回函数。功能可以 也可以写在其他函数中来封装有用的 嵌套函数范围内的功能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多