• swift闭包_002_swift闭包


    //: Playground - noun: a place where people can play
    
    import UIKit
    
    //-----闭包-------//
    //是独立的代码块,可以代码中进行传递和使用
    //swift中的闭包和OC中的block相似
    //函数是一种特殊的闭包,是有名称的闭包
    
    //1.基本使用
    /*
    闭包的语法:
    { (参数1,参数2) -> 返回值类型 in
        闭包的代码
    }
    */
    func add(a:Int, b:Int) -> Int {
        
        return a + b
        
    }
    
    let closure = {(a:Int, b:Int) -> Int in
        
        return a + b
    }
    
    add(1, b: 2)
    closure(1, 2)
    
    //闭包的类型就是函数类型
    let closure2 : (Int, Int)->Int = {(a:Int, b:Int) -> Int in
        
        return a + b
    }
    //闭包语法的简化,如果想省略闭包中参数和返回值的类型则需要显式的指定闭包变量的类型
    let closure3 : (Int, Int)->Int = {a,b in
        return a + b
        
    }
    
    //单表达式引式返回:如果闭包的代码中只有一个表达式,则return可以省略
    let closure4:(Int, Int)->Int = {a,b in a + b}
    closure4(10,5)
    
    //参数名也可以省略
    let closure5:(Int, Int)->Int = {$0 + $1}
    closure5(1,2)
    
    //2.分别用函数和闭包实现数组中元素的遍历(对数组中每个元素执行某段代码)
    func emnumerateArray(array : [Int], function: (Int) -> Void) {
        
        for item in array {
            function(item)
        }
    }
    
    //每个元素将要执行的函数
    func printItem(var item: Int) {
    
        item++
        print(item)
    }
    
    let array = [1, 2, 3, 7]
    //emnumerateArray(array, function: printItem)
    
    let closure6 = { (item: Int) -> Void in
        print(item)
    }
    
    emnumerateArray(array, function: closure6)
    
    emnumerateArray(array, function: { (item: Int) -> Void in
        print(item)
        }
    )
    
    //3.尾随闭包:如果闭包是最后一个参数,可以把闭包表达式写在函数参数()的后面,用来增加代码可读性
    emnumerateArray(array) { (item : Int) -> Void in
         print(item)
    }
    
    
    //4.闭包捕获值
    func makeIncrement(forIncrementor amount: Int) -> (Void)->Int {
        
        var total = 0
        
        //嵌套函数可以捕获外部函数的变量或者常量
    //    func incrementor() -> Int {
    //        
    //        total += amount
    //        print("total = (total)")
    //        
    //        return total
    //    }
    //    
    //    return incrementor
        
        //闭包可以捕获外部定义的变量或者常量
        let incrementor1 : (Void)->Int = {  (Void)->Int in
            
            total += amount
            print("total = (total)")
    
            return total
            
        }
        
        return incrementor1
        
        
    }
    
    let closure7 = makeIncrement(forIncrementor: 2)
    closure7()
    closure7()
    
    //闭包是引用类型
    let closure8 = makeIncrement(forIncrementor: 3)
    closure8()
    closure8()
    
    let closure9 = closure8
    closure9()
    
    var a = 0 //Int
    var b = a
    a = a + 1
    
    print(b)
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    aa
    ECS上搭建Docker(CentOS7)
    mysql时间戳转日期
    rsync用法
    docker安装mysql8
    使用Docker安装mysql,挂载外部配置和数据
    my.cnf
    Centos7通过yum安装jdk8
    maven添加本地包命令mvn install:install-file
    Mysql——查看数据库,表占用磁盘大小
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5563767.html
Copyright © 2020-2023  润新知