Swift 中的利刃,函数和闭包

Swift 中的利刃,函数和闭包

关于闭包的概念,相信有过其余语言开发经验的朋友都不会陌生了。简单来讲闭包的语言特性,大大增长了咱们的开发效率。而 Swift 更是将闭包运用的游刃有余,仿佛为它而生。下面我们进入正题。数组

Swift 中闭包的概念就像是 Objective-C 中的 block。 闭包能够嵌套和做为参数传递。 在 Swift 中,函数也只不过是一种特殊的闭包闭包

定义函数

Swift 中 可使用 func 关键字来定义函数。函数能够接收并返回一个或者多个参数和元组。 返回值跟随在 -> 符号后。函数

func sayHello(firstName: String, lastName: String) -> String {
    return "Hello \\(lastName) \\(firstName)"
}

调用函数

prinln(sayHello("John", "Smith"))        //"Hello Smith John"

函数的类型

每一个函数都有它本身的函数类型,经过它的参数和返回值来肯定。好比这个函数:ui

func add(left: Int, right:Int) -> Int { return left + right }

它的函数类型为:spa

(Int, Int) -> (Int)

咱们刚刚了解了函数类型的概念,它能够用来做为参数和返回值的类型来使用。code

将函数做为参数和返回值传递

下面这个函数的返回值仍然是一个函数,而且做为返回值的这个函数能够赋值给一个变量并调用:对象

func buildSayHello() -> (String,String) -> String {

    func hello(firstName:String, lastName:String) -> String {

        return "Hello \\(lastName) \\(firstName)"

    }
    return hello

}

let hello = buildSayHello()
hello("John","Smith")

是否是有点奇妙的感受了? 对,函数自己也是一个对象实例。ci

带有可变参数的函数

函数还能够接收任意数量的参数,经过 ... 来表示,而后咱们就能够在函数体中用数组的形式访问这个函数了:开发

func todo (tasks:String...) -> () {

    for task in tasks {

        println("* \\(task)")

    }

}
todo("exercise","study","sleep")

定义闭包

咱们刚说过,函数也是一种特殊的闭包,那么咱们再来看下定义闭包的语法:it

{() -> () in}

闭包的定义包含在一对大括号中,其中 () ->() 定义了函数的参数类型和返回值, ->的左边括号中是参数列表,右边是返回值。而后用 in 关键字将闭包的头部和主体分隔开来。对闭包定义的一个描述:

{(param) -> returnType in
    statements
}

好比咱们 Array 的 sort 方法接收的就是一个闭包参数:

var numbers:Array<Int> = [3,5,4,2,1,8]

numbers.sort { (lhs, rhs) -> Bool in
    return lhs < rhs
}

闭包的便捷操做

闭包还能够用参数的位置的形式来应用参数 ($0,$1,$2),好比仍是上面那个数组例子:

var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort({ return $0 < $1 })

再有,若是闭包做为参数列表中的最后一个参数,你能够直接忽略它外面的括号,就像这样:

numbers.sort { return $0 < $1 }
相关文章
相关标签/搜索