Swift学习3--函数和闭包

来源:互联网 发布:华为 网络管理 编辑:程序博客网 时间:2024/05/19 17:07

函数

1,函数的返回值可以是元组
2,函数的参数可以有默认值
3,输入输出参数 用&,可以进行地址传递
4,函数类型 可以类比函数指针,可以作为参数,也可以作为返回值:
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
let f = chooseStepFunction(backwards:false)
print(“(f(1))”)
5,嵌套函数–定义在其他函数内部的函数

闭包

闭包采取如下三种形式之一:
A.全局函数是一个有名字但不会捕获任何值的闭包
B.嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
C.闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包

1,闭包表达式语法有如下一般形式:
{ (parameters) -> returnType in
statements
}
使用举例:
let names = [“Chris”, “Alex”, “Ewa”, “Barry”, “Daniella”]
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed) // print: Ewa Daniella Chris Barry Alex

2,将闭包写在调用语句中:
var reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )

3,根据上下文推断类型--因为排序闭包是作为函数的参数进行传入的,Swift可以推断其参数和返回值的类型
var reversed = names.sorted(by: { s1, s2 in return s1 > s2 })

4,可以隐藏掉return
var reversed = names.sorted(by: { s1, s2 in s1 > s2 } )

5,参数名简写--使用参数名简写,可以省略参数名的定义和in关键字
var reversed = names.sorted(by: { 0>1 })

6,运算符函数
var reversed = names.sorted(by: >)

Trailing 闭包

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]

    let strings = numbers.map {        (number) -> String in        var number = number        var output = ""        repeat {            output = digitNames[number % 10]! + output            number /= 10        } while number > 0        return output    }    // strings is inferred to be of type [String]    // its value is ["OneSix", "FiveEight", "FiveOneZero"]

待研究

捕获 && 闭包是引用类型

runningTotal和amount被捕获
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
print(“(runningTotal)”)
return runningTotal
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen() // 10
incrementByTen() // 20

0 0
原创粉丝点击