In-Out Parameters (全局参数)

  像前面描述的参数变量,只能在函数体内进行修改,如果你需要函数修改的它的参数值,并且希望这些改变在函数调用结束后仍然有效,可以定义使用全局参数.

  定义全局参数使用关键字inout,全局参数的值在函数调用的时候进行传递,在函数体内进行修改,最后函数回传新值来替换之前的值.

  全局参数在函数中,只能使用变量来当作参数,不能使用常量或者文本值作为参数.因为常量或者文本值不可以被修改.为了表明参数变量可以被修改,要在变量名的前面直接添加一个&  符号.

  注意

  全局参数不能有默认值,可变参数不可以被当作全局参数来使用.如果你标记了参数为inout,你就不能再使用var或者let标记它们.

  下面演示一个swapTwoInts函数,它有两个全局参数a和b:

    func swapTwoInts(inout a: Int, inout b: Int) {

      let temporaryA = a

       a = b

       b = temporaryA

    }

  这个swapTwoInts函数只是简单的交换b和a的值,函数通过先存储a的值到一个临时常量temporaryA中,然后将b赋值给a,接着再将temporaryA赋值给b.

  你可以使用两个Int类型的变量来调用swapTwoInts函数,这可以交换它们的值,注意,在someInt和anotherInt的前面使用了&符号:

    var someInt = 3

    var anotherInt = 107

    swapTwoInts(&someInt, &anotherInt)

    println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")

    // prints "someInt is now 107, and anotherInt is now 3

  上面的例子演示了在函数swapTwoInts内部修改了someInt和anotherInt的初值,即便它们是定义在函数体之外的.

  注意

  全局参数与函数的返回值是不同的.上面的例子中swapTwoInts函数没有定义返回值,但是它仍然修改了someInt和anotherInt的值.全局参数是函数可以影响到函数体之外的一种变通  方式.

Function Types (函数类型)

  每个函数都会有一个特定的类型,它由参数类型和返回值类型组成.

  例如:

    func addTwoInts(a: Int, b: Int) -> Int {

     return a + b

    }

    func multiplyTwoInts(a: Int, b: Int) -> Int {

       return a * b

    }

  这个列子定义了两个简单的数学函数,叫做addTwoInts和multiplyTwoInts.每个函数都有两个Int值,并且返回一个Int值,它们的执行结果都是相似的数学操作.

  这两个函数的类型是 (Int, Int) -> Int.

  这可以被解释为:”函数的类型是,有两个参数,它们都是Int类型,并且它会返回一个Int类型的值”

  下面是一个函数,它没有参数或返回值:

    func printHelloWorld() {

      println("hello, world")

    }

  这个函数的类型是 () -> ().它的意思是”这个函数没有参数,它返回Void”.没有指定返回值的函数总是会返回Void,Void在Swfit中等于空,写作().

Using Function Types (函数类型的使用)

  使用函数的类型,就像在Swift中使用其他类型一样.例如,你可以定义一个常量或者变量来作为函数的类型,并赋值相应函数中的变量:

    var mathFunction: (Int, Int) -> Int = addTwoInts

  这段代码可以读为:

  ”定义一个叫做mathFunction的变量,它有一个函数的类型,这个函数带两个Int值,并返回一个Int值,设置这个变量需要引用叫做addTwoInts的函数.”

  函数addTwoInts的类型与变量mathFunction是相同的.因此这样的赋值是可以通过Swift的类型检查.

  你现在可以使用mathFunction来调用函数:

    println("Result: \(mathFunction(2, 3))")

    // prints "Result: 5”

  可以使用同样的方式来给同一个变量赋值不同的函数,只要函数的类型与变量匹配:

    mathFunction = multiplyTwoInts

    println("Result: \(mathFunction(2, 3))")

    // prints "Result: 6”

  对于其他的类型,你可以在赋值一个常量或者变量的时候,使用Swift自动函数类型检查:

    let anotherMathFunction = addTwoInts

    // anotherMathFunction is inferred to be of type (Int, Int) -> Int

Function Types as Parameter Types (函数类型作为参数类型)

  你可以使用函数类型来作为参数类型,给另一个函数使用.这可以让函数在调用的时候,可以使得函数调用者自己实现函数的一部分效果.

  例子:

    func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {

       println("Result: \(mathFunction(a, b))")

    }

    printMathResult(addTwoInts, 3, 5)

    // prints "Result: 8”

  这个例子定义了一个叫做printMathResult的函数,它有三个参数,第一个参数叫做mathFunction,它的类型是(Int, Int) -> Int,你可以传递这种类型的任意函数作为第一个参数.第二参  数和第三个参数叫做a和b,它们都是Int类型,它们被用来作为math函数的输入值.

  当调用printMathResult的时候,传递addTwoInts函数给它,以及整数值3和5,它会调用使用3和5来调用提供的函数(addTwoInts),并且输出结果8.

  printMathResult的作用是输出mathFunction的调用结果,而不用理会这个函数实际的执行过程,它只关注这个函数的正确类型.这使得printMathResult能放出一些功能个给函数的调  用者,并且是类型安全的方式进行的.

  /********************待续......************************/

转载于:https://www.cnblogs.com/caios/p/3851850.html

Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数)相关推荐

  1. Welcome to Swift (苹果官方Swift文档初译与注解八)---53~57页(第二章)

    Printing Constants and Variables (输出常量和变量) 使用println函数输出当前的常量值或者变量值: println(friendlyWelcome) // pri ...

  2. mac 无法启动linux系统安装,苹果官方技术文档显示新款Mac Mini不能安装Linux系统...

    原标题:苹果官方技术文档显示新款Mac Mini不能安装Linux系统 在10月底召开的新品发布会上,包括Mac Mini在内的新硬件上都装备了苹果T2安全芯片.作为Secure Enclave协处理 ...

  3. Java日志框架-Logback手册中文版以及官方配置文档教程

    Logback手册中文版:(链接: https://pan.baidu.com/s/1bpMyasR 密码: 6u5c),虽然版本有点旧,但是大体意思差不多,先用中文版了解个大概,然后一切最新的配置以 ...

  4. python语法手册chm-python3.5.2官方帮助文档 参考手册(CHM版)

    python3.5.2官方帮助文档 参考手册(CHM版) python3.5.2官方帮助文档 参考手册(CHM版),欢迎下载! 新语法特性: PEP 492,具有async和await语法的协同程序. ...

  5. python帮助文档中文版下载-python3.5.2官方帮助文档 参考手册(CHM版)

    python3.5.2官方帮助文档 参考手册(CHM版) python3.5.2官方帮助文档 参考手册(CHM版),欢迎下载! 新语法特性: PEP 492,具有async和await语法的协同程序. ...

  6. golang中文文档_【译】Go 语言源码贡献官方指导文档

    以前给 Go 语言项目源码提交过一些 commits,期间阅读他们的官方指导文档的时候觉得这篇指导文档可以作为绝佳的关于大型软件项目的规范管理的参考,因为最近又提交了几个 commits,就又把这篇文 ...

  7. apache 官方 Dubbo 文档

    只是分享.记录一下 dubbo 的文档地址:apache 官方 Dubbo 文档 其页面内容如下:(我是用 chrome 直接右键翻译的,原文档是英文的)

  8. python3.6库参考手册_python3.5.2官方帮助文档参考手册(CHM版)

    python3.5.2官方帮助文档 参考手册(CHM版) python3.5.2官方帮助文档 参考手册(CHM版),欢迎下载! 新语法特性: PEP 492,具有async和await语法的协同程序. ...

  9. QQ 一键加群、扫二维码加群 - 腾讯官方API文档接入

    QQ 一键加群.扫二维码加群 - 腾讯官方API文档接入 QQ一键加群功能,腾讯API生成链接和二维码等等 获取地址:腾讯官方API文档接口 使用方法:引入对应的链接即可 这里有生成图片.二维码的功效 ...

最新文章

  1. 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储+服务+抽象接口模式...
  2. 几种替代MATLAB的工具,堪称完美!
  3. php用wordanalysis抓取姓名_利用vba查询/抓取 外部数据
  4. 如何评价MSRA视觉组最新提出的Deformable ConvNets V2?
  5. 【转】Uncaught TypeError: Cannot set property ' ' of null 错误解决
  6. apache + subversion + Windows认证
  7. 【EMC】电压暂降、短时中断和电压变化
  8. “减少风险”还是“管理风险”哪一根才是救命稻草?
  9. [JSOI2008]最大数maxnumber(线段树)
  10. 基于Django的驾校在线考试系统
  11. 计算机网络 —— 链路层详解
  12. 炫酷的动态粒子背景效果(vue专属)
  13. 搭建Ubuntu 10.04系统(嵌入式开发)
  14. led流水灯c语言程序移位,LED流水灯程序 移位写法
  15. tansig、logsig公式与导数推导
  16. FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
  17. Redis之布隆过滤器(BloomFilter)
  18. 泰拳的快感之二——我看《冬荫功》
  19. 至每一位在努力奋斗的人-----复旦女生的高三生活
  20. 会计面试经常会被提问的11个问题!!

热门文章

  1. 区块链热度不断,那么究竟是泡沫还是未来?
  2. EOS能不能囤?一篇文章搞懂EOS优缺点
  3. deno使用rust_如何在Deno和Oak中使用MySQL
  4. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
  5. STARTUP报错:ORA-00205: error in identifying control file, check alert log for more info
  6. php instr函数,oracle的instr函数用法
  7. java培训教程分享:Java中用户如何自定义异常?
  8. 参加UI培训后可以找什么工作
  9. Android Monkey使用
  10. JSTL标签库的一些基础实例