swift深入理解闭包
Posted 紫洁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift深入理解闭包相关的知识,希望对你有一定的参考价值。
我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。
定义一个字符串的变量的方法:
直接赋值:
var string = "A string"
还可以用闭包的方式定义:
var string1: String = { return "A string" }()
闭包还可以这么定义,省略了等号和括号:
var string2: String { return "A string" }
闭包中可以定义get方法
var string3: String { get { return "A string" } }
也可以定义set方法,但定义set方法必须有get方法
var string4: String { get { return "A string" } set { print("set OK") } }
也可以使用 willSet 和didSet方法, 注意 willSet /didSet不能和get/set共同使用的, 在使用willSet /didSet时,变量需要有初始值
var string5: String = "A string" { willSet { print("newValue: \(newValue)") //"newValue: new Value\n" } didSet { print("oldValue: \(oldValue)") //"oldValue: A string\n" } }
string5 = "new Value"
通过上面这个例子, 我们感觉闭包的表达实现形式很多。 下面系统总结一下。
闭包最全的定义形式是:
{
(arguments)->returnType in
code
}(arguments)
可以在闭包中定义参数,返回值。 闭包后用括号执行,并在括号中可以传参。 例如:
var componseString = { (arg1: String, arg2: String) -> String in return arg1 + arg2 }("A", "B") print(componseString) //"AB\n"
基于上面最全的定义方式, 我么可以省略参数的类型:
var componseString1 = { arg1, arg2 -> String in return arg1 + arg2 }("A", "B") print(componseString1) //"AB\n"
为什么能省略参数类型? 那是因为, swift的类型推导,根据后面括号的传参能自动判断参数的类型。
然后我们可以省略闭包中的返回值类型
var componseString2: String = { arg1, arg2 in return arg1 + arg2 }("A", "B") print(componseString2) //"AB\n"
注意,闭包省略了返回值类型后,变量要显示声明它的类型, 之所以能省略返回值类型,那也是因为swift类型推导,先知道了变量的类型,所以可以省略返回值类型。
还可以把参数省略掉
var componseString3: String = { return $0 + $1 }("A", "B") print(componseString3) //"AB\n"
如果闭包中只有一行代码, 其实return 也能省略。
var componseString4: String = { $0 + $1 }("A", "B") print(componseString4) //"AB\n"
如果闭包没有定义参数 ,像这样
var componseString5: String = { return "A String" }() print(componseString5) //"A String"
可以把括号省略了,省略括号的同时,也不能写等号
var componseString6: String { return "A String" } print(componseString6) //"A String"
上面这种闭包表现方法似曾相识, 如果你学过swift的类,知道类的属性可以用闭包表示, 可以在闭包中定义 set, get , willSet,didSet等方法。 那么上面变量是否也能这样定义呢?
var string4: String { get { return "A string" } set { print("set OK") } }
var string5: String = "A string" { willSet { print("newValue: \(newValue)") //"newValue: new Value\n" } didSet { print("oldValue: \(oldValue)") //"oldValue: A string\n" } }
string5 = "new Value"
其实类的属性就是变量。 类的属性能定义的 set, get , willSet,didSet 在变量中也能定义。
本文摘自:http://my.oschina.net/lanrenbar/blog/467768
以上是关于swift深入理解闭包的主要内容,如果未能解决你的问题,请参考以下文章
Swift之深入解析闭包Closures的使用和捕获变量的原理
Swift之深入解析Sendable和@Sendable闭包代码实例
Swift之深入解析Sendable和@Sendable闭包代码实例