微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

初探swift语言的学习笔记三(闭包-匿名函数)

作者:fengsh998
原文地址:http://blog.csdn.net/fengsh998/article/details/29353019
转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998支持我,谢谢!


很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或block了,而叫闭包(closure)。下面配合代码来理解一下swift的闭包强大之处。使用系统的一个sort排序方法来演示一下闭包的使用,引用官网的事例

  1. //闭包(即匿名函数或OC中的block块函)
  2. letnames=["Chris","Alex","Ewa","Barry","Daniella"]
  3. //输出升序排序
  4. println(sort(names))
  5. funcbackwards(s1:String,s2:String)->Bool{
  6. returns1>s2
  7. }
  8. //使用自定义函数进行排序
  9. varreversed=sort(names,backwards)
  10. println(reversed)
  11. //使用闭包({(s1:String,s2:String)->Boolinreturns1>s2})函数进行排序
  12. vardesc=sort(names,{(s1:String,s2:String)->Boolinreturns1>s2})
  13. println(desc)
  14. //因为可以从names中推断出元素类型为String因此闭包可以直接省去->Bool
  15. vardes=sort(names,{s1,s2in println(des)
  16. //此外,swift中还可以从闭包中S1>S2,只有单的一表达式,可推断了结果是BOOL值
  17. //在这种没有歧义的情况下,可以省去return
  18. des=sort(names,s2ins1>s2})
  19. //还可以使用速记参数名
  20. //还可以直接使用运算符来排序
  21. println(des)

输出

    [Alex,Barry,Chris,Daniella,Ewa]
  1. [Ewa,Alex]
  2. [Ewa,Alex]
  3. [Alex,Ewa]
  4. 通过这些例子,可以看到swift的强大的编译及对代码的理解,只要代码足够清晰,没有歧义,就可以最大限度的省写一些代码,这样虽然减少了开发者的编码,同时代码的灵活情写法也有了大幅的提升,一定的范围内,对初学者的适应能力加大了。要写出更省更优的代码质量,我想是必要把各种可能认知到一个很高的深度。其实我很好期像

    funcbackwards(s1:String,s2:String)->Bool{
  1. returns1>s2
  2. }
  3. //使用自定义函数进行排序
  4. varreversed=sort(names,backwards)

    des=sort(names,>)
  1. println(des)

这两个是实现同一功能,但代码的编写量却相差较大,这是其一,其二,我想信这两个在编译时,计算机对代码的理解时间上也不一样,对于第一种比较清楚,计算机可能很快就认知,少了很多检查编译和验证,第二种,可能计算机要花少少时间来从names中推断各种可能后最终得到一个没有歧义的结果后才继续编译,其三,这两个在运行其运行效率是一样的吗?其四,读者的阅读上带来了一定的难度。就像光看一个>号,可能一下还不知道这是干嘛用的。但如果第一种情况就很好的知道是想干什么。

总而言之,swift的闭包有优也有略,大家在编码中就取其之长避其之短吧。当然什么是长,什么是短,读者自己定义了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐