Swift学习之每日一tip (3)闭包

前端之家收集整理的这篇文章主要介绍了Swift学习之每日一tip (3)闭包前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

闭包介绍

最近在学习swift的过程中,发现很多人都对于swift的闭包有很深的疑惑,今天就以我个人学习swift 1.2版本下的一些经验进行一些分享,如有错漏,望大家指出。
ps.《关于Swift学习之每日一tip》我这段时间会持续更新,而其中关于swift的内容都是在今年(2014)春节之后,苹果推出Xcode6.3测试版的之后推出的swift 1.2的语法,关于1.2与1.1的语法,我会在明天的内容中进行一下介绍。

通用闭包

首先,给大家写一段常见的闭包代码

demo{ (name) -> () in
    println("\(name): 完成了吗?")
}

上面这个闭包实际上是闭包的一个回调,下面写出准备好的闭包的内容

func demo(finished:(name: String)->()) {
    println("小明正在玩命工作中... ")

    // 执行闭包,完成耗时操作后,做回调
    let t = "大 BOSS"
    finished(name: t)
}

执行结果:

小明正在玩命工作中... 
大 BOSS: 完成了吗?

以上就是一个最常用的闭包,在这里,闭包实际上与Objective-c中的Block定义非常相似,都是先定义出后面准备好的闭包的内容,然后再在我们需要的地方进行闭包的调用,即可。
大家理解了闭包的原理之后,我们再来分析这段闭包代码

// 闭包的格式
    /**
    { (参数) -> (返回值) in 
         代码实现
    }
    */

大家在初学闭包的时候,可以比照着这个格式来看闭包的调用,因为一般在调用的时候,闭包会更加的直观。

  • 在上面这段代码中,在回调时,我们打印了一句话,传入了一个闭包内部定义好的名字。
  • 而在闭包的准备内容中,我们可以看到,在这里,实际上可以看做是C++或者其他高级语言中的函数,而我们的闭包实际上是一个参数。
  • 在这个函数内部,我们在需要的地方,进行闭包的调用
  • 然后,我们再在其他需要执行这个函数的地方进行回调代码,传入我们在回调时想要得到的效果
  • 整个过程实际上就是代理设计模式的设计思路,这在苹果的ios开发中,非常常见,具体可以参照Objective-c中的代理和Block

不知道通过上面的这些内容,大家对于闭包有没有一个初步的认识?

下面介绍一下闭包的一种常见简化写法:

尾随闭包

实际上,第一次看到尾随闭包的时候,我并没有意识到这是一个闭包,因为他太简单了,简单到什么程度?

demo2 {
    println("over"        
}

对,你没看错,就是这样。这就是一个尾随闭包的调用
实际上,他的完整版应该是这样的:

demo2 { () -> () in
      println("over")
}

看到这里,相信聪明的同学已经猜出来了,这个尾随闭包顾名思义,如果闭包是最后一个参数,可以进行简化,当这个闭包里连参数都没有的话,我们就可以像上面那样写出如此简单的闭包调用
在这里我们定义一下这个闭包:

func demo2(completion:()->()) {
    // 执行耗时操作
    println("耗时操作")

    // 回调
    completion()
}

这个闭包就是符合我上面所说的闭包是最后一个参数,同时闭包里连参数都没有。
当然尾随闭包只需要闭包是最后一个参数的情况下就可以进行简写,这里就不写了,因为本人并不推荐那样的写法,可读性太差了!!

最后,我再简单说一下闭包的返回值:

闭包的返回值

废话不多说,上代码

// 闭包的返回值
    demo3 { () -> Int in
        return 10
    }

在这里,大家似乎应该都发现了,我在写代码的时候都喜欢先写调用,再写闭包的内容,这里当然是为了大家方便理解,抛开语法的束缚,不喜勿喷哟~^_^。
下面是闭包的定义:

func demo3(rowCount:()->Int) {
    // 通过闭包的返回值,获得数据信息
    let count = rowCount()
    println("行数 \(count)")
    // ...
}

这么简单的过程,相信小伙伴们应该都不需要我再多废话了吧,今天就到这里,明天再见。

猜你在找的Swift相关文章