在书中," Swift Programming Language 3.0",它提到了闭包的类型包括:
全局函数是具有名称但不捕获的闭包 任何值
嵌套函数是具有名称和可以的闭包 从其封闭函数中捕获值
关闭表达式 用可捕获的轻量级语法编写的未命名闭包 来自周围环境的价值
我只是想知道类范围中存在的函数是否算作闭包?人们当然可以传递这样的函数作为其他函数的参数,但它是一个闭包吗?
答案 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中的实例方法。