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

  • 相关阅读:
    无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。
    jQuery导航菜单防刷新
    IE6下Png透明最佳解决方案(推荐) Unit PNG Fix
    每周进步要点(第50周12.4-12.11)
    学习笔记:重塑你的自我驱动力
    学习笔记之是什么决定我们的命运
    读书《万万没想到 3》
    人与人之间的鄙视链是如何形成的?
    第7本《万万没想到-用理工科思维理解世界2》
    中明写公众号的时候他在想什么
  • 原文地址:https://www.cnblogs.com/muzijie/p/5823254.html
Copyright © 2011-2022 走看看