swift 学习笔记二:Closures

本文深入介绍了Swift中的闭包表达式,包括语法结构、简化方法、值捕获特性及闭包作为引用类型的说明,并通过实例展示了如何使用闭包进行数组排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Closure Expression Syntax  (语法定义)

{ (parameters) -> return type in 
     statements
}

看一个例子,对字符串数组排序:
var names = […]
var reversed = sorted(names, {(s1: String, s2: String) -> Bool in
     return s1 > s2
})

swift还提供了一连串的简化方法:
1. Referring Type from Context (从上下文环境中推断参数和返回值的类型,就可以省略不写了)

var reversed = sorted(names, {s1, s2 in return s1 > s2})


2. Implicit Returns from Single-Expression Closures  (如果只有一行语句,return 也可以省略)

var reversed = sorted(names, {s1, s2 in s1 > s2})


3. Shorthand Argument Names     (命名参数也可以省略,用 $n 代替)

var reversed = sorted(names, {$0 > $1})

4. Operator Functions     (直接用操作符)

var reversed = sorted(names, >)


. Trailing Closures     (如果Closure是最后一个参数,可以写在参数括号的外面)

sample 1:
var reversed = sorted(names) { $0 > $1}

sample 2:
let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

numbers.map {
    (var number) -> String in
    var output = ""
    while number > 0 {
        output = digitNames[number%10]! + output
        number /= 10
    }
    return output
}


. Capturing Values     (访问上下文中的变量,即使外部函数已经结束,它所捕获的变量依然存在,见下面例子中的runningTotal )

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
   
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
   
    return incrementer
}

let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()          10
incrementByTen()          20

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()          7
incrementBySeven()          14

. Closures Are Reference Types (Closure是引用类型,还是看 runningTotal)

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()     30



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值