实例方法是否关闭?

时间:2016-11-04 02:51:14

标签: ios swift function closures

在书中," Swift Programming Language 3.0",它提到了闭包的类型包括:

  

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

     

嵌套函数是具有名称和可以的闭包   从其封闭函数中捕获值

     

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

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

1 个答案:

答案 0 :(得分:2)

是的!绝对!以下是使用String的{​​{3}}方法的示例。

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()的主体,对上一步中给出的实例进行操作,然后返回{{1结果。

因此,这也是有效的:

String

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

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