Swift 柯里化以及autoclosure

参考文章:
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 == "[email protected]" else{
            return
        }
        if password() == "xiaohuang"{
            print("right")
        }else{
            print("error")
        }
    }
    
  
 func email163(account:String,password:String){
        guard account == "[email protected]" else{
            return
        }
        if password == "xiaohuang"{
            print("right")
        }else{
            print("error")
        }
    }
    

email126(account: "[email protected]", password: "xiaohuang")
email163(account: "[email protected]", password: "xiaohuang")

调用方式相同,但是两种方式有什么区别?
email126 调用函数时,将不会考虑 password情况,直到执行password()闭包时才会考虑

email126 将会考虑 password的情况

这就是autoclosure的好处

你可能感兴趣的:(Swift基础记)