swift闭包——swift学习(六)

说到闭包,很多人都会有疑问,闭包是个什么鬼?到底是用来干什么的?什么时候会用到?怎么用?
OK,那我们就来好好分析分析这些东西:
首先,我们写过代码的朋友的第一件事肯定就会开始寻找,swift的这个东西会是我们现在用到的什么呢?或者说和我们现在的什么东西有些类似呢??OK,那我告诉你,c语言的匿名函数、c++的lambda(我的 c++复习(五)——lambda)、OC的block都与我们的闭包差不多。具体分析给大家推荐一个文章fl2011sx的关于OC中的Block,Swift中的闭包,C++11中的lambda表达式等匿名函数详解
OK,干货也推荐完了。我就来整理整理自己的学习与使用心得,如果您已经了解了闭包这个东西,那么您也就没有必要往下看了,这里整理的也都不是很深层次的东西。
首先,用大神阮一峰——学习Javascript闭包(Closure) 的话来说的话,闭包就是用来读取其他函数内部变量的函数。读完这句话,我真的是秒懂了。希望刚接触swift闭包的同学也去拜读一下大神的这篇文章。
理论的东西,相信大家也差不多了。那么我们就来看看怎么用吧!
我的 swift学习(五)——函数、函数类型及使用 我已经很详细地讲解了swift的函数类型了。我就发现我使用闭包的时候老是有函数类型的影子。但是其实我们没必要去故意区分这两个东西,因为闭包就是匿名函数,而我们定义的闭包变量也就是一种特定的函数变量,例如:

var myClosure:((Int,Int)->Int)?
//使用typealias
typealias MyClosureType = (Int,Int)->Int
var my closure:MyClosureType?

我认真看了极客学院关于闭包的东西 ,分的很细。但是其实呢,除了简化闭包的东西之外,我认为就主要学习两种就可以了,一是作为返回值,一是作为参数传递:

//闭包
//将test作为闭包返回
func closure(i:Int)->()->Int{
    var n=99
    func test()->Int{
        return n+i
    }
    return test
}
let result = closure(1)
print("\(result())")

//将闭包作为参数传递,大多数时候我们是使用这个的
func closureTest(i:Int,closure:(Int,Int)->Int)->Int{
    let n = 99
    return closure(n,i)
}
//使用
let test = closureTest(9) { (a:Int, b:Int) -> Int in
    return a+b
}
print("\(test)")

OK,使用到这里,大概swift的闭包就可以搞起了。那么我们最后来看看闭包作为替代oc中block的新东西是怎么具体操作的:
两个VC,一个是button,点击button的时候,将button的当前文字传回到另一个VC中,并在label上显示出来:

使用typealias取个别名
typealias ReturnCurrentSelected = (currentText:String)->Void
在类中生成一个闭包变量
var returnClosure:ReturnCurrentSelected?
使用:这里是直接调用的属性。其实呢,我们最好写一个set方法。
self.currentSelectedItemName = button.currentTitle;
if self.returnClosure != nil {
     self.returnClosure?(currentText: self.currentSelectedItemName!);
 }
 set方法:
 func setBackCurrentSelectedText(currentTextClosure:ReturnCurrentSelected){
        self.returnClosure = currentTextClosure;
}
OK。另一个VC
//添加一个测试闭包的Label
closureTestLabel = UILabel.init(frame: CGRect(x:100,y:200,width: CGRectGetWidth(self.view.frame)-200,height:50));
closureTestLabel?.font.fontWithSize(30)
closureTestLabel?.textAlignment = NSTextAlignment.Center
closureTestLabel?.backgroundColor = UIColor.grayColor()
closureTestLabel?.textColor = UIColor.blackColor()
self.view.addSubview(closureTestLabel!)

//使用属性   
sliderView?.returnClosure = {(currentText:String)->Void in
     self.closureTestLabel?.text = currentText
} 
//使用set方法:
sliderView?.setBackCurrentSelectedText({(currentText:String)->Void in
            self.closureTestLabel?.text = currentText
})

ok,到这里,我觉得起码的使用应该不是问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值