美文网首页
Swift~闭包

Swift~闭包

作者: 水中的蓝天 | 来源:发表于2020-06-14 17:35 被阅读0次

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

    嵌套类型

    • 嵌套类型相当于其他语言中的内部类
    示例.png

    枚举、结构体、类都可以定义方法

    • 一般把定义在类、结构体、枚举内部的函数,叫做方法
    
    class Size {
    
        var width = 10
        var height = 10
        
        func show() {
    
        print("width=\(width), height=\(height)")
    
       }
    }
    
    let s = Size()
    s.show() //width=10  height=10
    
    ----------------------------------------------------
    
    struct Point {
    
        var x = 10
        var y = 10
        
        func show() {
    
        print("x=\(x), y=\(y)")
    
       }
    }
    
    let p = Point()
    p.show() //width=10  height=10
    
    --------------------------------------
    
    
    enum PokerFace: Character {
    
        case spades = "♥", hearts = "♣"
        
         func show() {
    
          print("face is \(rawValue)")
    
        }
    }
    
    let pf = PokerFace. hearts
    p.show() //face is  ♣
    
    
    

    方法不论是定义在值类型、引用类型里面或者外面其都是存储在代码段的

    闭包表达式

    • 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
    
    闭包的格式:
    {
    
    (参数列表) -> 返回值类型  in  函数体代码
    
    }
    
    
    var fn = {
    
       (v1:Int , v2:Int) -> Int in
       
       return v1 + v2
    
    }
    
    fn(10,20)
    
    -------------------------------------
    
     {
    
       (v1:Int , v2:Int) -> Int  in
       
       return v1 + v2
    
    }(10,20)
    
    

    闭包表达式缩写

    示例图.png

    更加简写的方式

    
    exec(v1: 10, v2: 20, fn: +)
    
    

    尾随闭包

    • 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性
    • 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式
    func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {
    
    print(fn(v1, v2))
    
    }
    
    --------------------------------------------
    
    与上面代码等价
    exec(v1:10, v2: 20) {
    
    $0 + $1
    
    }
    
    
    • 如果闭包表达式是函数的唯一实参,而且使用尾随闭包的语法,那就不需要再函数名后边写圆括号
    
     func exec(fn: (Int, Int) -> Int) {
    
    print(fn(v1, v2))
    
    }
    
    --------------------------------------------
    等价于上面代码
    
    exec(fn: {$0 + $1})
    exec() {$0 + $1}
    exec {$0 + $1}
    
    

    Array排序

    
    官方定义
    func sort(by areInIncreasingOrder: (Element, Element) -> Bool)
    
    //返回true:    i0排在i1前面
    //返回false:  i0排在i1后面
    func cmp(i0: Int, i1: Int)->Bool {
        //大的排前面
        return i0 > i1
    }
    
    var arr = [10,3,4,20,90]
    
    //从小到大排序
    arr.sort()
    
    //自定义排序规则:从大到小排序
    arr.sort(by cmp(2,1))
    
    //闭包表示
    arr.sort{$0 > $1}
    
    

    忽略参数

    
    exec {
    _ , _  in 20
    }
    
    表示不论传什么参数进来,都不管它;直接返回20
    两个下划线表示两个参数
    
    
    

    闭包(Closure)

    • 一个函数和它所捕获的变量、常量环境组合起来,称之为闭包

    这里的函数是指:一般定义在函数内部的函数;一般它捕获的是外层函数的局部变量、常量

    注意:一旦捕获了外部的局部变量和常量形成闭包就会在堆空间申请内存;

    外部变量捕获.png
    • 可以把闭包想象成是一个类的实例对象
    • 内存在堆空间
    • 捕获的局部变量/常量就是对象的成员(存储属性)
    • 组成闭包的函数就是类内部定义的方法
    示例.png 示例2.png

    注意:如果返回值是函数类型,那么参数的修饰要保持统一

    示例.png

    自动闭包

    自动闭包.png

    相关文章

      网友评论

          本文标题:Swift~闭包

          本文链接:https://www.haomeiwen.com/subject/ddjtxktx.html