LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

初探Swift六 - 闭包

Clicks: 2047 Date: 2015-01-13 10:37:28 Power By 李轩Lane

swift ios

    

    初探Swift,本文关于Swift闭包、Swift闭包特性(比如结尾闭包和捕获参数)、Swift闭包引用类型的相关介绍与实践。swift闭包一个很重要的特性,可以简化代码,优化流程。使代码更加简洁。

    一、闭包(Closure),将函数的声明和逻辑代码都放在参数的位置,闭包的本质还是函数。

import UIKit

/**

 * 闭包(Closure),将函数的声明和逻辑代码都放在参数的位置,闭包的本质还是函数。

 */

var arr = [2, 1, 5, 3, 9, 0, 4]

//使用闭包将数组从大到小排列,sorted不穿第二个参数时默认为从下到大,闭包放在{}中,用()来声明2个变量,->来声明返回值,后面跟一个in,逻辑代码放在in后面。

var result = sorted(arr, {(a:Int, b:Int)->Bool in

    return a > b

})

result

//闭包的简化操作,闭包中2个参数的类型可以省略,返回值声明可以省略

result = sorted(arr, {a, b in return a > b})

result

//闭包进一步简化,省略return

result = sorted(arr, {a, b in a>b})

result

//闭包再进一步优化,省略a,b两个参数声明,用$0, $1来代替,省略in关键字

result = sorted(arr, {$0 > $1})

//再省,因为“>”就是函数,是运算符函数

result = sorted(arr, >)

//注:必须是单行的才可以省略return, in已经ab的声明

result

    二、结尾闭包,闭包的参数里面{},看起来别扭,而且开发时可能会出现括号的对应问题。当传入闭包是最后一个参数的时候,可以使用如下的方式。仅仅是最后一个的时候可以!

/**

 * 结尾闭包,闭包的参数里面{},看起来别扭,而且开发时可能会出现括号的对应问题。当传入闭包是最后一个参数的时候,可以使用如下的方式。仅仅是最后一个的时候可以!

 */

result = sorted(arr){a, b in

    return a > b

}

result

    三、捕获参数(capturing values)我们可以在闭包中使用闭包外的变量

/**

 * 捕获参数(capturing values)我们可以在闭包中使用闭包外的变量

 */

var num = 3

result = sorted(arr){

    return fabs(Float($0-num)) < fabs(Float($1-num))

}

result

    四、引用类型:将函数(闭包)赋值给函数类型的变量A,函数类型的变量A再赋值给函数类型的变量B,那么,A和B是指向同一块地址的,调用A引起的变化再变量B中将会体现

/**

 * 引用类型

 */

func calcTotalMiles(todayMiles:Int)->()->Int{

    var totalMiles = 0

    return {totalMiles += todayMiles; return totalMiles;}

}

var dailyTwoMiles = calcTotalMiles(2)

//结果:2

dailyTwoMiles()

//结果:4

dailyTwoMiles()

//把函数复制给另一个变量

var myPlan = dailyTwoMiles

//调用这个变量

//结果:6

myPlan()

//结果:8

myPlan()

//回过头来调用之前被赋值的变量(函数类型的变量),看值是否改变

//结果:10

dailyTwoMiles()

//说明这个是引用传递的,函数类型的变量myPlan和函数类型的变量dailyTwoMiles是指向同一个地址的。


©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号