swift 学习笔记二:Closures

4 篇文章 0 订阅
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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值