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闭包代码实例

Swift之深入解析Sendable和@Sendable闭包代码实例

javascript深入理解js闭包

知识深入理解js闭包