【问题标题】:Function return a function that returns a function函数返回一个函数返回一个函数
【发布时间】:2014-12-30 12:46:46
【问题描述】:

我想要一个函数返回一个函数,该函数返回一个与第一个函数具有相同签名的函数。 IE。该函数应该能够提供自己作为返回值。

这可能在 swift 中实现吗?

示例(这不会编译!):

typealias nextStep = ((char: CChar) -> nextStep)

func process(char: CChar) -> nextStep {...}

【问题讨论】:

  • 我认为它没有编译的原因是因为 nextStep 返回 nextStep 返回 nextStep 等等,在这个链的末尾,nextStep 将总是返回一个不是类型的 nextStep。
  • 同意,但是有没有其他方法可以实现代码的意图?

标签: ios macos swift


【解决方案1】:

Thomas 的答案应该可行,但如果您想要一个更安全的替代方案:

struct F {
    let f: (Character) -> F
}

func f(ch: Character) -> F {
    println("I've been called with an \(ch)!")
    return F(f: f)
}

let g = f("a")
let h = g.f("b")
h.f("c")

【讨论】:

  • 谢谢,这个解决方案可以编译。还不知道运行时,但它在概念上是合理的,所以它应该可以正常工作。
【解决方案2】:

像这样使用Any

typealias nextStep = ((char: CChar) -> Any)

func process(char: CChar) -> nextStep {
  return process
}

【讨论】:

  • 我已经接受了这个答案,但现在在调用返回的函数时遇到了困难。有什么建议吗? (我不断遇到错误消息“'Any' is not convertible to '(CChar)->Any'”)
  • 我添加了let p = process(CChar()) as nextStep,它确实可以编译,但下次使用p 时出现运行时错误。嗯...
  • 我猜你最好选择 Airspeed 的解决方案。这在任何方面都有效。我不知道为什么上面会导致运行时错误。
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 2012-09-11
  • 1970-01-01
  • 2021-12-18
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多