文档章节

swift 深入理解Swift的闭包

沉恋
 沉恋
发布于 2015/06/17 14:17
字数 709
阅读 12709
收藏 8
点赞 2
评论 1

我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。  

定义一个字符串的变量的方法:  

直接赋值

var str="JobDeer"

还可以用闭包的方式定义:

var str:String={

        return "JobDeer"

  }()

闭包还可以这么定义,省略了等号和括号:

var str:String{

        return "JobDeer"

  }

闭包中可以定义get方法。

var str:String{

    get{

        return "JobDeer"

    }

}

既然用可以用get方法, 那么能用set方法吗?  

可以的:  

var str:String{

    get{

        return "JobDeer"

    }  

 set{

        println("set ok")

     }

}

我们在用 willSet 和didSet方法试一试,  注意 用 willSet /didSet不能和get/set共同使用的, 在使用willSet /didSet时,变量需要有初始值。 所以这么使用:  

var str:String="JobDeer"{

    willSet{

        println("newValue:\(newValue)")

    }

    didSet{

        println("oldValue:\(oldValue)")

     }

}

str="new value"


通过上面这个例子, 我们感觉闭包的表达实现形式很多。 下面系统总结一下。

最全的定义形式是 :

{

    (arguments) ->returnType  in 

     code 

}(arguments)

可以在闭包中定义参数,返回值。 闭包后用括号执行,并在括号中可以传参。 例如: 

var str={

    (arg1:String,arg2:String)->String in

        return arg1+arg2;

}("Job","Deer")


基于上面最全的定义方式, 我么可以省略参数的类型:  

var str={

    arg1,arg2->String in

        return arg1+arg2;

}("Job","Deer")

为什么能省略参数类型?  那是因为, swift的类型推导,根据后面括号的传参能自动判断参数的类型。


然后我们可以省略闭包中的返回值类型

var str:String={

    arg1,arg2 in

        return arg1+arg2;

}("Job","Deer")

   注意,闭包省略了返回值类型后,变量要显示声明它的类型, 之所以能省略返回值类型,那也是因为swift类型推导,先知道了变量的类型,所以可以省略返回值类型。


    还不够爽,我们可以把参数也省略了


var str:String={

        return $0+$1;

}("Job","Deer")

   

    如果闭包中只有一行代码, 其实return 也能省略。

var str:String={

         $0+$1;

}("Job","Deer")


      如果闭包没有定义参数 ,像这样

var str:String={

       return "JobDeer"

}()

   括号中根本没有传参数, 括号能不能省略呢?

  可以把括号省略了   

   省略括号的同时等号也不能写

var str:String{

       return "JobDeer"

}


    上面这种闭包表现方法似曾相识, 如果你学过swift的类,知道类的属性可以用闭包表示, 可以在闭包中定义 set, get , willSet,didSet等方法。 那么上面变量是否也能这样定义呢?  

    答案是肯定的:  

可以定义set,get,willSet,didiSet等方法


var str:String{

    get{

        return "JobDeer"

    }  

  set{

        println("set ok")

     }

}

或者: 

var str:String="JobDeer"{

    willSet{

        println("newValue:\(newValue)")

    }

    didSet{

        println("oldValue:\(oldValue)")

     }

}

str="new value"


  其实类的属性就是变量。 类的属性能定义的 set, get , willSet,didSet 在变量中也能定义。

本文转载自:

共有 人打赏支持
沉恋
粉丝 9
博文 55
码字总数 63031
作品 0
苏州
加载中

评论(1)

fiy_fish
fiy_fish
讲的好详细啊,谢谢作者,终于理解 闭包和属性的关系了
深入理解Moya

前言 Moya是一个基于Alamofire开发的,轻量级的Swift网络层。Moya的可扩展性非常强,可以方便的RXSwift,PromiseKit和ObjectMapper结合。 如果你的项目刚刚搭建,并且是纯Swift的,非常推荐以...

黄文臣 ⋅ 2017/08/11 ⋅ 0

深入理解swift中闭包的捕捉语义

参考链接:losures Capture Semantics, Part 1: Catch them all! 概述 原文中先定义一个Pokemon类 延时执行的闭包 默认捕捉语法 在swift中默认的捕捉语法是:被捕获的变量在闭包被执行的时候才...

Pnyg_回眸 ⋅ 2017/10/19 ⋅ 0

Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下 ⋅ 2017/12/06 ⋅ 0

Swift讲解专题八——闭包

Swift讲解专题八——闭包 一、引言 Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。 二、从一个系统函...

珲少 ⋅ 2016/05/14 ⋅ 3

RxSwift之路 1#Swift语法知识准备

在开始学习 RxSwift 之前,一定要对 Swift 相关语法有所了解,否则就很难理解为什么可以这样。关于 Swift 的学习其实只要看看 Swift 的官方文档就可够了。我之前也列过一些学习资源:来自一线...

没故事的卓同学 ⋅ 2017/07/11 ⋅ 0

swift1.2语言函数和闭包函数介绍

swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加。其中,大量的代码往往相互重复或者近似重复。如果不采有效方式加以解决,代码将很难维护。 swift1.2...

大学霸 ⋅ 2015/03/30 ⋅ 0

智捷公开课马上开始了--第一系列读《Swift开发指南(修订版) 》看Swift视频教程

引用: 智捷课堂携手51CTO学院、图灵教育联合举办iOS线上培训就业班系列体验公开课。 分享移动开发、移动设计方向最新,最热,最抢眼技术热点以及设计经验。我们每周将最少举办一次公开课,同...

智捷课堂 ⋅ 2015/01/15 ⋅ 0

Swift解读专题一——Swift2.2语言预览

专题一——Swift2.2语言预览 一、引言 本系列专题是我通过阅读Swift2.2语言开发文档,翻译总结加上自己的理解整理而成。其中大部分结构和内容都来自开发文档,有疏漏和错误之处,还望更多朋友...

珲少 ⋅ 2016/05/05 ⋅ 0

Swift笔记-让你2小时学会Swift

过年不能闲着,一边学习Swift,一边写笔记,相信在有一定其他语言基础的情况下用1.5小时看完该文章即可掌握。然后再花30分钟打开XCode写个Demo. 生命中拿出2小时来认识一门语言,很值吧! 笔...

程序员孟帅 ⋅ 2016/02/10 ⋅ 20

swift语法学习

变量和常量 变量,可以修改的 常量,一经定义不能修改 在swift开发中,通常先定义常量,只有必须修改的时候,再改成 注意点: swift是一个对变量类型要求及其严格的语言 任何数据类型之间,都...

冷漠叻荭颜 ⋅ 2015/05/10 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 36分钟前 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 52分钟前 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部