iOS经典讲解之Swift匿名函数(闭包)(二)

时间:2022-10-19 20:28:17


作者:Loving_iOS

转载请标明出处:http://blog.csdn.net/loving_ios/article/details/49365785

本次讲解的开发环境为Xcode7.0.1 创建playground文件,进行的代码编写。

// **********************闭包********************

/* 闭包(Closures)
* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。
* 闭包可以捕获和存储上下文中定义的的任何常量和变量的引用。这就是所谓的变量和变量的自封闭,
* 因此命名为”闭包“("Closures)").Swift还会处理所有捕获的引用的内存管理。
*
* 全局函数和嵌套函数其实就是特殊的闭包。
* 闭包的形式有:
* (1)全局函数都是闭包,有名字但不能捕获任何值。
* (2)嵌套函数都是闭包,且有名字,也能捕获封闭函数内的值。
* (3)闭包表达式都是无名闭包,使用轻量级语法,可以根据上下文环境捕获值。
*
* Swift中的闭包有很多优化的地方:
* (1)根据上下文推断参数和返回值类型
* (2)从单行表达式闭包中隐式返回(也就是闭包体只有一行代码,可以省略return)
* (3)可以使用简化参数名,如$0, $1(从0开始,表示第i个参数...)
* (4)提供了尾随闭包语法(Trailing closure syntax)
*/

// Swift中的闭包相当于Block又叫做匿名函数
//语法
/*
{
(参数列表) -> 返回值 in
函数实现体 ...

}
*/

// 使用系统排序函数对闭包的省略机制进行说明
var numbers = [1, 3, 5, 7, 2]
var number_result = numbers.sort()
// 使用闭包进行说明
var number_result1 = numbers.sort({

(num1:Int, num2:Int) -> Bool in

return num1 > num2

})

// 省略机制:
// 闭包的参数类型可以省略 可以根据上下文进行推断类型
var number_result2 = numbers.sort({

(num1, num2) -> Bool in

return num1 > num2
})

//in 前面的语句可以省略 此时没有参数名 使用$0 $1 进行替换

var number_result3 = numbers.sort({

return $0 > $1
})

// 如果函数实现体内只有一条return语句 ,那么 return也可省略
var number_result4 = numbers.sort({

$0 > $1
})

// 极简模式
var number_result5 = numbers.sort(>)
//********************以上是闭包的省略机制******************

// 尾随机制
// 当闭包作为参数列表的最后一个参数时 并且内容相对复杂 可以尾随在参数列表外面
var number_result6 = numbers.sort(){

(num1, num2) -> Bool in

return num1 > num2
}

// 闭包常用于参数 函数常用语返回类型
typealias myType = (String) -> String

func getPetName(name:String) ->String {

return "name = \(name)"
}

func pet(name:myType) -> myType {

return getPetName
}

pet(getPetName)

// 闭包作为参数
pet({

(name:String) -> String in

return "name = \(name)"
})

// 练习:传入"3" "4" 返回 "7" 利用闭包写

typealias myType2 = (String, String) -> Int

func closure(clo:myType2) ->String {

let result_clo = clo("3", "4")

return result_clo.description

}

closure({
(num1:String, num2:String) -> Int in

return Int(num1)! + Int(num2)! // 字符串转Int Int(String)!
})