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)
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    IOS GameCenter验证登陆
    BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
    Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash
    HDU 5343 MZL's Circle Zhou 后缀自动机+DP
    HDU 6208 The Dominator of Strings 后缀自动机
    SPOJ SUBLEX
    SPOJ LCS2
    .NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标
    扑克模拟,牌型判断java版
    一道综合练习题实践list及dictionary集合类
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5563767.html
Copyright © 2011-2022 走看看