参考文章:
https://juejin.im/post/5a508a536fb9a01cad7bfb60
https://swift.gg/2016/04/06/swift-qa-2016-04-06/
https://www.jianshu.com/p/5b27fec8c616
一、柯里化 Currying
柯里化(Currying)是从数学里借用过来的编程语言技法(基于20世纪Haskell Curry等数学家的研究成果)。柯里化指的是从一个多参数函数变成一连串单参数函数的变换。它描述的是变换的过程,不涉及变换之后对函数的调用。调用者可以决定对多少个参数实施变换,余下的部分将衍生为一个参数数目较少的新函数。这个新的函数接收剩下的参数,其内部则指向原始函数。当提供的参数完整了才会最终执行原始函数。
简单理解为:以前是return 一个值,现在是return 一个待执行的闭包
func append(_ left:String) -> ((_ right:String)->String){
let new:(String) -> String = { aa in
return left + aa
}
return new
}
let str = append("a")("b") // "ab"
这有什么卵用?只是一种思想
在看这个,就有点意思了
func verify(_ phone:String?) -> ((_ password:String) -> Bool){
let verifyPassword:(String) -> Bool = { pass in
if phone == nil{
return false
}else{
return true
}
}
return verifyPassword
}
let result = verify(nil)("123456789") //false
二、自动闭包 @autoclosure
柯里化是返回闭包,自动闭包时传入闭包,且参数为空,自动按照闭包处理
func email126(account:String,password: @autoclosure ()->String){
guard account == "xoxo_x@126.com" else{
return
}
if password() == "xiaohuang"{
print("right")
}else{
print("error")
}
}
func email163(account:String,password:String){
guard account == "xoxo_x@126.com" else{
return
}
if password == "xiaohuang"{
print("right")
}else{
print("error")
}
}
email126(account: "sssssss@126.com", password: "xiaohuang")
email163(account: "aaaaaa@163.com", password: "xiaohuang")
调用方式相同,但是两种方式有什么区别?
email126 调用函数时,将不会考虑 password情况,直到执行password()闭包时才会考虑
email126 将会考虑 password的情况
这就是autoclosure的好处