【问题标题】:Are instance methods closures?实例方法是闭包吗?
【发布时间】:2017-10-14 05:28:46
【问题描述】:

在《Swift Programming Language 3.0》一书中,提到闭包的类型包括:

全局函数是具有名称且不捕获的闭包 任何值

嵌套函数是有名字的闭包 从它们的封闭函数中捕获值

闭包表达式是 以轻量级语法编写的未命名闭包,可以捕获 来自周围环境的值

我只是想知道存在于类范围内的函数是否算作闭包?当然可以将这样的函数作为参数传递给其他函数,但它是闭包吗?

【问题讨论】:

标签: ios swift function closures


【解决方案1】:

是的!绝对地!这是一个使用Stringlowercased() 方法的示例。

let aClosure: (String) -> () -> String = String.lowercased


let anUpperCasedString = "A B C"
print(anUpperCasedString)

let aLowerCaseString = aClosure(anUpperCasedString)()
print(aLowerCaseString)

可以看到这个闭包的类型是(String) -> () -> String。这是因为String.lowercased 完全未被应用,它不知道它在哪个实例上运行。

调用aClosure(anUpperCasedString) 将返回一个现在为() -> String 的闭包。烘焙到其中的是它将操作的实例。只有当你调用这个不带参数的新闭包(())时,它才会真正执行lowercased()的主体,对你在上一步中给它的实例进行操作,并返回String结果。

因此,这也是有效的:

let aLowerCaseString = String.lowercased("QWERTY")()

它只是在一个内联步骤中完成上述所有步骤。

这种技术称为函数柯里化。 This post 更多地讨论了这种技术(称为函数柯里化),因为它适用于 Swift 中的实例方法。

【讨论】:

  • 哇,你的回答简直太棒了!感谢您以清晰易懂的方式解释它!非常感谢您的帮助!
  • @TonyStark 没问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多