swift闭包总结

来源:互联网 发布:java file.length单位 编辑:程序博客网 时间:2024/05/24 03:22
////  main.swift//  Swift之闭包总结////  Created by Goddog on 15/7/15.//  Copyright (c) 2015年 Goddog. All rights reserved.//import Foundationprintln("闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包")//MARK: - 使用闭包表达式代替嵌套函数//定义函数,该函数返回值类型为(Int) -> Intfunc getFunc(#type:String) ->(Int) ->Int{    //该函数返回的是闭包    switch(type)    {        case "square":            return { (val:Int) ->Int in                return val * val            }        default:            return { (val:Int) ->Int in                return val * val * val            }    }}var mathFuc = getFunc(type: "square")println(mathFuc(2))mathFuc = getFunc(type: "others")println(mathFuc(2))//MARK: - 闭包表达式格式/**    {        (形参列表) -> 返回值类型 in            //零条或多条可执行语句    }*///MARK: - 调用闭包//定义闭包var square = {(value val:Int) -> Int in                return val * val            }//调用闭包println("直接调用闭包:\(square(3))")//使用闭包表达式定义闭包,并在闭包表达式后面增加圆括号来调用该闭包var result = {(#base:Int,#exponent:Int) -> Int in                var result = 1                for i in 1...exponent                {                    result *= base                }                return result            }(2,3)                //注意了println("圆括号调用闭包:\(result)")//MARK: - 利用上下文推断类型var squares:(Int) -> Int = {val in return val * val}var results:(Int) = {base, exp in            return base + exp        }(1,2)println(squares(2))println(results)//MARK: - 省略returnvar square1 : (Int) ->Int = {val in val * val}println("省略return:\(square1(3))")//MARK: -var square2 : (Int) ->Int = {$0 * $0}println("省略形参名:\(square2(2))")var result2 : Int = {        var result = 1        for i in 1...$1        {            result *= $0        }        return result    }(2,2)println(result2)//MARK: - 尾随闭包/**尾随闭包则是一个提高可读性的写法-如果调用函数的最后一个参数是闭包,Swift将调用函数的反圆括号提前到闭包表达式的正花括号({)之前*///定义函数类型的形参,其中fn是(Int) -> Int类型的形参func map(var #data : [Int], #fn : (Int) -> Int)->[Int]{    for var i=0; i<data.count; i++    {        data[i] = fn(data[i])    }    return data}var data = [2, 3, 4, 5, 6]//尾随闭包,省略了形参类型、形参名、返回值类型、return关键字var rvt2 = map(data: data){$0 * $0}println(rvt2)var rvt3 = map(data: data){$0 * $0 * $0}println(rvt3)//MARK: - 捕获上下文中的变量和常量//闭包可以访问或修改上下文中的变量或常量(常量只能访问不能修改)//Swift最简单的闭包形式就是嵌套函数,嵌套函数可以捕获它所在的封闭函数的变量、常量及其参数//定义一个函数,该函数返回值类型为() -> [String]func makeArray(ele : String) -> () ->[String]{    //创建一个不包含任何元素的数组    var arr:[String] = []    func addElement() ->[String]    {        arr.append(ele)        return arr    }    return addElement}let add1 = makeArray("曹操")println(add1())println(add1())let add2 = makeArray("刘备")println(add2())println(add2())//MARK: - 闭包是引用类型/**当程序把一个函数或闭包赋值给一个变量或者常量时,程序并没有正真使用该变量或常量来存储这个函数或闭包,程序只是让该引用变量引用被赋值的函数或闭包而已这意味这当程序把一个闭包赋值给两个引用变量时,程序并不会复制他们,而是让两个引用变量指向同一个闭包*/let add3 = add2println(add3())println(add3())
闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包48直接调用闭包:9圆括号调用闭包:843省略return:9省略形参名:44[4, 9, 16, 25, 36][8, 27, 64, 125, 216][曹操][曹操, 曹操][刘备][刘备, 刘备][刘备, 刘备, 刘备][刘备, 刘备, 刘备, 刘备]Program ended with exit code: 0


0 0
原创粉丝点击