swift闭包总结

//
//  main.swift
//  Swift之闭包总结
//
//  Created by Goddog on 15/7/15.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

import Foundation

println("闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包")

//MARK: - 使用闭包表达式代替嵌套函数
//定义函数,该函数返回值类型为(Int) -> Int
func 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: - 省略return
var 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 = add2
println(add3())
println(add3())








闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。闭包采取如下三种形式之一:1. 全局函数是一个有名字但不会捕获任何值的闭包;2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包
4
8
直接调用闭包:9
圆括号调用闭包:8
4
3
省略return:9
省略形参名:4
4
[4, 9, 16, 25, 36]
[8, 27, 64, 125, 216]
[曹操]
[曹操, 曹操]
[刘备]
[刘备, 刘备]
[刘备, 刘备, 刘备]
[刘备, 刘备, 刘备, 刘备]
Program ended with exit code: 0

Swift技术学习 https://www.itkc8.com

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值