Swift-闭包简单使用


//: Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

/**

闭包(Closures):
闭包:是自包含的代码块,可以在代码中被传递和使用
闭包可以捕获和存储其所在上下文中任意常量和变量的引用,这就是所谓的闭包并包裹着这些常量和变量,俗称闭包.
闭包的几种形式:
1,“全局函数是一个有名字但不会捕获任何值的闭包
2,嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
3,闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包”
闭包的常见优化场景:
1,“利用上下文推断参数和返回值类型
2,隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
3,参数名称缩写
4,尾随(Trailing)闭包语法”
*/


/**
sorted函数
1,接收两个参数:
1>已知类型的数组
2>闭包函数,

*/
// sorted函数
var strs = ["dd", "cc", "aa", "bb"]

func backwards(str1:String, str2:String)->Bool
{
    return str1 > str2
}

var sortFun = sorted(strs, backwards)


/**
 闭包表达式语法
// 格式
{ (parameters) -> returnType in
    statements
}
1, 函数和返回值都在大括号之内
2, in:该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始
*/
// 使用
 sortFun = sorted(strs, { (str1:String, str2:String) -> Bool in
    str1 > str2
})


/**
根据上下文推断类型:
    通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,所以几乎不需要利用完整格式构造任何内联闭包

*/
sortFun = sorted(strs, {str1, str2 in return str1 > str2})


/**
单表达式闭包隐式返回:
    通过隐藏return 关键字来隐式返回单行表达式的结果
*/

sortFun = sorted(strs, {s1, s2 in s1 > s2})



/**
参数名称缩写:
    1,内联函数的参数名称可以缩写,使用比如:$0,$1顺序调用闭包参数
    2,如果使用了参数名称缩写,可以省略参数的定义,因为名称缩写的类型会根据函数类型进行推断
    3,in关键字也可以省略,闭包表达式完全由闭包函数体构成
*/

sortFun = sorted(strs, {$0 > $1})


/**
运算符函数:
    1,Swift的String类型定义了关于大于号(>)的字符串实现
    2,">"作为一个函数接收两个String类型的参数,并返回Bool类型
*/
// 此处刚好满足">"运算符的条件
sortFun = sorted(strs, >);



/**
尾随闭包
    使用情况:如果需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性
*/

// 不使用尾随闭包
func aFunc(closur:()->())
{
    // 函数体部分
}

// 只有一个闭包参数的尾随闭包
aFunc({
    // 闭包主体部分
})

// 有多个参数,且最后一个参数为闭包的的尾随闭包
aFunc(){
    // 闭包主体部分
}

// 如果函数只有闭包表达式一个参数,使用尾随闭包可以省略"()"
aFunc{

}

// 字符串数组的sorted排序可以简写
sortFun = sorted(strs){
    $0 > $1
}




/**
Swift的Array类型有一个map方法:
    0,获取一个闭包表达式作为其唯一参数,并返回该元素所映射的值(可以是不同类型的值)
    1,数组中的每一个值都会调用这个闭包
    2,具体的映射方法和返回值类型由闭包来指定
    3,当提供给数组闭包函数后,map方法将返回一个新的数组,数组中包含了与原数组--对应映射后的值
*/

/**
使用map的尾随闭包方法将Int型数组[123, 58, 79]转换为包含对应String类型的数组["OneTwoThree","ThreeFourTwo,"OneTwo""]
*/

let digitNames = [
    0 : "Zero", 1 : "Two", 3 : "Three",4 : "Four",5 : "Five",
    6 : "Six", 7 : "Seven", 8 : "Eight",9 : "Nine"
]

let numbers = [123, 58, 79]

let numbersToStrings = numbers.map{
    (var number)-> String in

    var outPut = ""

    while(number > 0)
    {
        // 个位
        var num1 = number % 10
        outPut += digitNames[num1]!
        number /= 10
    }

    return outPut
}

numbersToStrings





/**
闭包表达式(Closure Expressions)
*/








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值