//
// main.swift
// LessonSwiftSix
//
// Created by keyan on 15/9/13.
// Copyright (c) 2015年 keyan. All rights reserved.
//
import Foundation
/*
(1)闭包的概念和分类
自包含的函数代码块
全局函数(有名)
闭包表达式(匿名)--能捕获上下文中德常量或者变量
嵌套函数(*)
*/
/*
(2)闭包表达式的语法
func funcName(参数) -> 返回值类型{
执行语句
}
{
(参数)->返回值类型 in
执行语句
}
*/
let sayhello = {
println("hello World")
}
sayhello()
let add:(Int,Int) ->Int = {
(a:Int,b:Int)->Int in
return a + b
}
println(add(3,5))
/*
(3)闭包表达式回调用法
*/
func showArray (array: [Int]) {
for x in array {
print("\(x),")
}
println()
}
func bubbleSort( cmp:(Int,Int) ->Int,inout array: [Int]){
let cnt = array.count
for var i = 1;i<cnt; i++ {
for var j = 0; j < cnt-i;j++ {
if (cmp(array[j],array[j+1]) == -1){
let t = array[j]
array[j] = array[j+1]
array[j+1] = t
}
}
}
}
var array = [20,3,2,70,8]
//showArray(array)
//let intcmp = {
// (a:Int,b:Int) -> Int in
// if a>b{
// return -1
//
// }
// else if a < b {
// return 1
// }
// else
// {
// return 0
// }
//}
//swift特有的类型推断
showArray(array)
/*
(4)闭包表达式优化
*/
//bubbleSort(&array,{
//// (a,b) in
// let x = $0 % 10,y = $1 % 10
// if x>y{
// return -1
//
// }
// else if x < y {
// return 1
// }
// else
// {
// return 0
// }
//})
showArray(array)
/*
(5)尾随闭包
*/
bubbleSort({
// (a,b) in
let x = $0 % 10,y = $1 % 10
if x>y{
return -1
}
else if x < y {
return 1
}
else
{
return 0
}
}
, &array
)
//sort(&array,{
//// (a: Int,b: Int) -> Bool in
//// return a < b
// return $0 < $1
//
//})
//尾随闭包
sort(&array){
// (a: Int,b: Int) -> Bool in
// return a < b
return $0 < $1
}
showArray(array)
/*
嵌套函数
*/
//func swapValue(inout a : Int,inout b : Int)
//{
// let t = a
// a = b
// b = t
//}
func bubbleSortFunc(inout array: [Int]){
let cnt = array.count
//放到内部嵌套函数作用于内部
func swapValue(inout a : Int,inout b : Int)
{
let t = a
a = b
b = t
}
for var i = 1;i<cnt; i++ {
for var j = 0; j < cnt-i;j++ {
if (array[j]>array[j+1]){
// let t = array[j]
// array[j] = array[j+1]
// array[j+1] = t
swapValue(&array[j], &array[j+1])
}
}
}
}
var array1 = [5,21,10,2,3]
bubbleSortFunc(&array1)
showArray(array1)
/*
(7)闭包捕获值
*/
//func getIncFunc(inc :Int) -> (Int) -> Int{
// func incFunc(v: Int) -> Int {
// return 10+v
// }
// return incFunc
//}
func getIncFunc(inc :Int) -> (Int) -> Int{
var mt = 10
func incFunc(v: Int) -> Int {
mt++
return inc + mt + v
}
return incFunc
}
let incFunc1 = getIncFunc(3)
let incFunc2 = getIncFunc(3)
println(incFunc1(10))
println(incFunc1(10))
println(incFunc2(10))