Swift学习笔记(12)——闭包

16 篇文章 0 订阅

语法

以下定义了一个接收参数并返回指定类型的闭包语法:

{(parameters) -> return type in
   statements
}

简单的小例子:

let divide = {(val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}
let result = divide(200, 20)
print (result)

//以上程序执行输出结果为:10

let names = ["AT", "AE", "D", "S", "BE"]

// 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = names.sorted(by: backwards)

print(reversed)
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]

sorted(by:)方法需要传入两个参数:
1.已知类型的数组。 || 例子中为names数组
2.闭包函数。 || func backwards(s1: String, s2: String)->Bool {return s1 > s2}
传入参数:2个,与数组元素类型相同 || 两个Sting类型
返回值:布尔类型值。 || s1>s2,大于true
True——排序结束后传入的第一个参数排在第二个参数前面
False——排在后面

参数名称缩写。可以直接通过 0, 1,$2来顺序调用闭包的参数。
若用参数名称缩写,可以在闭包参数列表中省略对其定义, swift会进行函数类型推断。in 关键字同样也可以被省略。
实例

let names = ["AT", "AE", "D", "S", "BE"]

var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)
// $0$1表示闭包中第一个和第二个String类型的参数。
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]

let names = ["AT", "AE", "D", "S", "BE"]

var reversed = names.sorted(by: >)
print(reversed)
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]

利用运算符函数,只传递一个运算符。
使用前提:sorted(by:)方法与(>)大于号运算符函数的传入参数和返回值类型相同。
Swift 的String类型定义了关于大于号 (>) 的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。 而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。

四.尾随闭包

let names = ["AT", "AE", "D", "S", "BE"]

//尾随闭包
var reversed = names.sorted() { $0 > $1 }
print(reversed)
// sort() 后的 { $0 > $1} 为尾随闭包。
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]

如果函数只需要闭包表达式一个参数,使用尾随闭包时,甚至可以把()省略掉。即为:reversed = names.sorted { 0> 1 }

五.捕获值

闭包的形式有:
1.全局函数:有名字但不能捕获任何值。
2.嵌套函数:有名字,也能捕获封闭函数内的值。
3.闭包表达式:无名闭包,使用轻量级语法,可以根据上下文环境捕获值。

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int { // 闭包获取了runningTotal和amount的值
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen = makeIncrementor(forIncrement: 10)

// 返回的值为10
print(incrementByTen())

// 返回的值为20
print(incrementByTen())

// 返回的值为30
print(incrementByTen())

//以上程序执行输出结果为:
//10
//20
//30
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值