zoukankan      html  css  js  c++  java
  • 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)
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)
    [转]最常用的商务职场英语邮件100个句式
    [转]玩转Angular2(4)--制作左侧自动定位菜单
    [转]Angular开发(十八)-路由的基本认识
    Consul之:服务注册与发现
    Consul之:key/value存储
    服务容错保护断路器Hystrix之六:服务熔断和服务降级
    延时队列:Java中的DelayQueue
    分布式延迟消息队列实现分析与设计
    基于redis的延迟消息队列设计
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5563767.html
Copyright © 2011-2022 走看看