DahuangPhoneiOSSwift → Swift中的闭包


  共有8088人关注过本帖树形打印复制链接

主题:Swift中的闭包

帅哥哟,离线,有人找我吗?
dahuangphone
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:407 积分:4533 威望:0 精华:0 注册:2012/9/29 7:54:10
Swift中的闭包  发帖心情 Post By:2014/10/11 20:56:23 [只看该作者]

//闭包就是一个自包含的匿名函数代码块。格式为{(参数列表)->返回值 in 代码}。它可以引用上下文环境中的代码块。


func calculate(opr:String)->(Int,Int)->Int{

    var c=8;

    //定义嵌套函数,作用域为此函内

    func add(a:Int,b:Int)->Int{

        return a+b+c;

    }

    func sub(a:Int,b:Int)->Int{

        return a-b+c;

    }

    var resultFunc:(Int,Int)->Int;

    

    switch opr{

    case "*":

        resultFunc={$0*$1};

    case "+":

        resultFunc={ a,b in return a+b+c};

    case "-":

        resultFunc={ a,b in a+b};

    default:

        resultFunc={ (a:Int,b:Int)->Int in return a+b+c;}   //闭包写法

    }

    return resultFunc;  //可以将嵌套函数作为返回值传递出去,这样就可以在此函数体外使用

}


let f1:(Int,Int)->Int=calculate("+");

var f1s=f1(1,2);

println("\(f1(1,2))");


//单行闭包简化写法


var closeFunc:(Int,Int)->Int={ (a:Int,b:Int)->Int in return a+b;} //基本写法


//上文形参Swift能够推断出类型,返回值也能推断出来,所以可以简化城下面这种方式


closeFunc={ a,b in return a+b}


//如果闭包只有一条语句,可以把return也省略掉


closeFunc={ a,b in a+b}


//闭包可以用$0$1$2等来代替闭包中的参数。$n表示第n+1个参数。使用这种参数名称缩写,还可以在闭包中声裂参数定义,in也可以省略


closeFunc={$0+$1}


 //多行语句的各种写法,不能省略return


closeFunc={(a:Int,b:Int)->Int in let c=9;return a+b+c;}

closeFunc={a,b in let c=9;return a+b+c;}  //省略参数和返回值定义

closeFunc={let c=9;return $0+$1+c;}   //使用$n代替参数,省略in


//总结,

//1. in何时可以省略:使用$的时候,in可以省略

//2. return何时可以省略:当只有一个语句的时候,return可以省略

//3. 闭包最外面的{}代表闭包范围,然后是匿名函数定义(a:Int,b:Int)->Int,in到}之间部分是函数代码。

//4. 闭包关于参数定义必须用()包裹起来,并且不能把返回值包进去

//5. 如果使用 $n 的方式,必须在闭包 内的代码里有$n, var abc:(Bool)->Void={ $0 } 可以,var abc1:(Bool)->Void={  } 是不合法的



var result:Int=closeFunc(1,2);

result={a,b in return a+b}(1,2);  //闭包可以直接带参数。


//尾随闭包


func calculate(opr:String,funN:(Int,Int)->Int){

    switch opr{

        case "+":

            funN(10,5);

    default:

        funN(10,5)

    }

}


calculate("+", {$0+$1});   //正常写法

calculate("+"){$0+$1};  //尾随写法,需要最后函数最后一个参数是闭包或者函数。


//闭包捕获上下文中的变量和常量


func makeArray()->(String)->[String]{

    var ary:[String]=[String]();

    func addElement(element:String)->[String]{

        ary+=element;

        return ary;

    }

    return addElement;

}


let f11=makeArray();

var fResult11=f11("aaa");  //运行完以后,ary这个数组尽管是栈分配,但依然存在,并且最新值被保存, 这一点非常重要

fResult11=f11("bbb");  //fResult11是["aaa","bbb"]

let f111=f11   

fResult11=f111("bbb");   //fResult11是["aaa","bbb","bbb"],说明闭包是引用类型,需要注意。



let f12=makeArray();

var fResult12=f12("aaa");

fResult12=f11("bbb");  //这里面实际上是fResult11 + “bbb” ary始终与makeArray()保持一致


//需要注意,尽管ary是在makeArray函数里面,但是闭包依然可以在外部调用、修改它。


//闭包练习


var array:[Int]=[1,2,4,3];


array.sort({$0<$1});   //


array.sort{$0<$1};   //尾随闭包写法


array.sort({(item1:Int,item2:Int) -> Bool in return item1<item2})  //最普通写法


array.sort({item1,item2 in item1<item2})  //简化参数定义和返回值写法,只有一行代码,省略return


array.sort({(item1,item2) -> Bool in item1<item2})   //简化参数定义写法,只有一行代码,省略return


array.sort({item1,item2 in return item1<item2})   //简化参数定义和返回值写法,


array.sort{item1,item2 in item1<item2}   //闭包尾随写法


println("\(array)");


//变态写法


func add(a:Int,b:Int,c:(Int,Int)->Int)->Int{

            return c(a,b)

}

        

var result=add(1,2,+)  // + 是一个闭包,完整样子是 {(a:Int,b:Int)->Int in return a+b}

        

println("\(result)")

[此贴子已经被作者于2014/10/16 17:20:53编辑过]

 回到顶部