zoukankan      html  css  js  c++  java
  • 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
    "
        }
        didSet {
            print("oldValue: (oldValue)")   //"oldValue: A string
    "
        }
    }

     string5 = "new Value"

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

    闭包最全的定义形式是:

    {

      (arguments)->returnType in

          code

    }(arguments)

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

    var componseString = {
        
        (arg1: String, arg2: String) -> String in
        
            return arg1 + arg2
        
    }("A", "B")
    
    print(componseString)    //"AB
    "

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

    var componseString1 = {
    
        arg1, arg2 -> String in
        
            return arg1 + arg2
        
    }("A", "B")
    
    print(componseString1)     //"AB
    "

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

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

    var componseString2: String = {
    
        arg1, arg2 in
        
            return arg1 + arg2
    
    }("A", "B")
    
    print(componseString2)     //"AB
    "

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

    还可以把参数省略掉

    var componseString3: String = {
        
        return $0 + $1
        
    }("A", "B")
    
    print(componseString3)     //"AB
    "

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

    var componseString4: String = {
    
        $0 + $1
        
    }("A", "B")
    
    print(componseString4)     //"AB
    "

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

    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
    "
        }
        didSet {
            print("oldValue: (oldValue)")   //"oldValue: A string
    "
        }
    }

     string5 = "new Value"

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

    本文摘自:http://my.oschina.net/lanrenbar/blog/467768

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/muzijie/p/5823254.html
Copyright © 2011-2022 走看看