函数

  1. 函数定义
 func foo(firstname:String ,lastname:String)->(fullname:String){
      return("\(firstname) \(lastname)")
 }
  1. 函数类型
    每一个函数都有它的类型,函数的类型由函数本身的参数类型和返回值类型来决定的。
func sum(x:Int,y:Int) -> (result:Int){return x + y}
//该函数类型为(Int,Int)->(Int)
  1. 返回函数类型
    构建函数时作为参数或者返回值使用
func foo()->((String,String) -> String){
   func bar(firstname:String,lastname:String) ->(fullname:String){
    return("\(firstname) \(lastname)")
  }
  return bar
}
let namecombination = foo()
namecombination("wang","er")

闭包

  • 个人认为闭包解决了跨作用域调用函数内部变量,函数之间相互调用内部变量等问题
  1. 闭包定义
    闭包是一个使用花括号{} 包围起来,并且使用函数类型()->()来定义的代码模块。->符号分割了输入参数和返回值类型。在关键字 in 来区分闭包的头和闭包函数体。
 {(params) -> returnType in 
    //闭包体
 }
  1. 闭包作为函数参数传入
func mySort(array:Array<Any>,sortClosure:(int,int) -> Bool) -> Array<Any> {
	//可以调用sortClosure
	return array
}
  1. 传入闭包的优化

    1. 省略返回值
    2. 省略return(闭包只有一行代码)
  2. 后置闭包,逃逸闭包和自动闭包

1. 后置闭包: 不将闭包作为参数传入,而写在函数尾部,增强可读性
//原结构
mySort(array: &stuArr, sortClosure: {
    (stuArr[$0] as! Student).achievement > (stuArr[$1] as! Student).achievement
})
//后置闭包结构
mySort(array: &stuArr){
    (stuArr[$0] as! Student).achievement > (stuArr[$1] as! Student).achievement
}
2. 自动闭包:实现简单闭包自动生成,闭包不能有参数,也只能有一句表达式
func myFunc2( closure:@autoclosure @escaping ()->Bool)  {
    
}
//调用函数时,直接传入一个表达式即可,编译器会自动生成闭包参数
myFunc2(closure: 1+2+3>10)

What is broken can be reforged.