zoukankan      html  css  js  c++  java
  • 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"
    

    函数的类型

    每个函数都有它自己的函数类型,通过它的参数和返回值来确定。比如这个函数:

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

    它的函数类型为:

    (Int, Int) -> (Int)
    

    我们刚刚了解了函数类型的概念,它可以用来作为参数和返回值的类型来使用。

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

    下面这个函数的返回值仍然是一个函数,并且作为返回值的这个函数可以赋值给一个变量并调用:

    func buildSayHello() -> (String,String) -> String {
    
        func hello(firstName:String, lastName:String) -> String {
    
            return "Hello (lastName) (firstName)"
    
        }
        return hello
    
    }
    
    let hello = buildSayHello()
    hello("John","Smith")
    

    是不是有点奇妙的感觉了? 对,函数本身也是一个对象实例。

    带有可变参数的函数

    函数还可以接收任意数量的参数,通过 ... 来表示,然后我们就可以在函数体中用数组的形式访问这个函数了:

    func todo (tasks:String...) -> () {
    
        for task in tasks {
    
            println("* (task)")
    
        }
    
    }
    todo("exercise","study","sleep")
    

    定义闭包

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

    {() -> () in}
    

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

    {(param) -> returnType in
        statements
    }
    

    比如我们 Arraysort 方法接收的就是一个闭包参数:

    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 }
    

    更多文章请访问: www.theswiftworld.com
    更多好文,扫码关注微信公众号:

    更多文章请访问: www.theswiftworld.com
  • 相关阅读:
    Minimum Path Sum,最短路径问题,动态规划
    UniquePaths,UniquePaths2,路径问题。动态规划。
    LengthOfLastWord,字符串最后一个子串的长度
    间隔问题,合并间隔(merge interval),插入间隔(insert interval)
    矩阵螺旋遍历Spiral Matrix,Spiral Matrix2
    Centos 5.2 下配置 php 的 json 扩展
    一个睡五分钟等于六个钟头的方法
    js div 排除内部的点击事件 就是 冒泡的处理
    做微信开发 “人脉圈的” 总结
    YII 学习笔记
  • 原文地址:https://www.cnblogs.com/theswiftworld/p/4292248.html
Copyright © 2011-2022 走看看