08月20, 2017

Swift系列一 | 初识Swift-闭包和函数

Swift里面使用func来声明一个函数(Golang也是使用这个关键词声明一个函数),使用名字和参数来调用函数。使用->来指定函数的返回值。

func greet(person: String, day: String) -> String{
    return "Hello \(person), today is \(day)"
}
greet(person: "Peter", day: "Sunday")

默认情况下,函数使用它们的参数名称作为它们的参数的标签,在参数名称前可以自定义参数标签,或者使用_表示不使用标签

func greet(_ person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)"
}
greet("John", on: "Wedmesday")

使用元祖来让一个函数返回多个值。该元祖的元素可以用名称或数字来表示。

func calculateStatistics(scors: [Int]) -> (mix: Int, max: Int, sum: Int) {
    var min = scors[0]
    var max = scors[0]
    var sum = 0
    for scor in scors {
        if ( scor > max ) {
            max = scor
        } else if scor < min {
            min = scor
        }
        sum += scor
    }
    return (min,max,sum)
}
let statistics = calculateStatistics(scors: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)

函数可以嵌套,被嵌套的函数可以访问外部函数的变量,可以使用嵌套函数来重构一个太长或者太复杂的函数。

func returnFifteen() -> {
    var y = 10
    func add () {
        y += 5
    }
    add()
    return y;
}
returnFifteen()

函数是第一等类型,这意味着函数可以作为另一个函数的返回值

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
print(increment(7))

函数也可以当做参数传入另外一个函数

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThenTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThenTen(number:))

函数实际上是一种特殊的闭包: 他是一段能之后被调用的代码。闭包中的代码能访问闭包所建作用域中能得到的变量和函数,及时闭包是一个不同的作用域被执行的。在上面的嵌套函数例子中所看到。可以使用{}来创建一个匿名闭包。使用in关键词将参数和返回值类型声明与闭包函数体进行分离.

 numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})

有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽 略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。 你可以通过参数位置而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。 当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。

sort([1,2,3,12,2]) {$0 > $1}

本文链接:http://codepowers.com/post/basic-knowledge-closure-function.html

-- EOF --

Comments