当前位置: 首页 > 编程日记 > 正文

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

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

相关文章:

递归 尾递归_代码简报:递归,递归,递归

递归 尾递归Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事: A beginner’s guide to recursion: 6 minute read 递归初学者指南: 6分钟阅读 Things you probably didn’t know you …

Hadoop 生态系统

当下 Hadoop 已经成长为一个庞大的生态体系,只要和海量数据相关的领域,都有 Hadoop 的身影。下图是一个 Hadoop 生态系统的图谱,详细列举了在 Hadoop 这个生态系统中出现的各种数据工具。这一切,都起源自 Web 数据爆炸时代的来临。…

socket通信——通过Udp传输方式,将一段文字数据发送出去

需求:通过Udp传输方式,将一段文字数据发送出去定义一个Udp发送端思路:1、建立updsocket服务2、提供数据,并将数据封装到数据包中。3、通过socket服务的发送功能,将数据包发出去4、关闭资源。import java.net.*; class …

编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器

编码中统一更该变量的快捷键by freeCodeCamp通过freeCodeCamp 流媒体的7种方式使您成为更好的编码器 (7 Ways Streaming Makes you a Better Coder) After coding live on twitch.tv for dozens of hours, I’m convinced that streaming makes you a better coder. Here’s w…

AutoConfig工具使用

下载安装Auto工具包: http://code.taobao.org/mvn/repository/com/alibaba/citrus/tool/antx-autoconfig/1.0.9/antx-autoconfig-1.0.9.tgzhttp://code.taobao.org/mvn/repository/com/alibaba/citrus/tool/antx-autoexpand/1.0.9/antx-autoexpand-1.0.9.tgztar zxv…

Spark2 ML 学习札记

摘要:  1.pipeline 模式 1.1相关概念 1.2代码示例  2.特征提取,转换以及特征选择 2.1特征提取 2.2特征转换 2.3特征选择 3.模型选择与参数选择 3.1 交叉验证 3.2 训练集-测试集 切分 4.spark新增SparkSession与DataSet 内容: 1.pipeline …

xCode 开发快捷键

Ctrl CMD 右箭头返回上一个编辑的界面Ctrl CMD 左箭头返回后一个编辑的界面CMD Option 左箭头区域代码折叠CMD Option 右箭头区域代码展开Shift CMD Option 左箭头折叠界面内所有的代码Shift CMD Option 右箭头展开界面内所有的代码CMD Ctrl 上下箭头.h 和 .m …

javascript模块_JavaScript模块第2部分:模块捆绑

javascript模块by Preethi Kasireddy通过Preethi Kasireddy JavaScript模块第2部分:模块捆绑 (JavaScript Modules Part 2: Module Bundling) In Part I of this post, I talked about what modules are, why developers use them, and the various ways to incorp…

idea上实现github代码同步

1.先将github远程仓库clone到本地 2.将本地仓库中的项目导入到idea中 3.如果你的项目代码不是放在仓库的根目录下,idea会识别到你的项目是在git仓库目录下,必须点击add root才能匹配路径。 4.add root后会发现右击项目时会多了一个git选项 5.在git选项中…

iOS12 UITabbar Item 向上漂移错位的bug

[[UITabBar appearance] setTranslucent:NO]; 加此行代码 完美解决此bug

jQuery学习笔记(一)

补充一些自己容易忘的知识点: event.stopPropagation() 阻止事件冒泡 event.preventDefault() 阻止事件的默认行为 return false 相当于event.stopPropagation() event.preventDefault() 。除了阻止默认行为之外,还会阻止事件冒泡。 转载于:https://www.cnblogs.…

随机网络构建_构建随机报价机

随机网络构建by Ayo Isaiah通过Ayo Isaiah 构建随机报价机 (Building a Random Quote Machine) I really wasn’t entirely satisfied with my first attempt at building a Random Quote Generator on Free Code Camp. It was ugly, and the quotes were too long, so I didn…

20145231 《信息安全系统设计基础》第11周学习总结

20145231《信息安全系统设计基础》第11周学习总结 教材学习内容总结 异常 异常是异常控制流的一种形式,由硬件和操作系统实现。简单来说,就是控制流中的突变。 出现异常的处理方式: 1.处理器检测到有异常发生 2.通过异常表,进行间…

JAR命令使用

jar 命令详解 jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因…

捍卫者usb管理控制系统_捍卫超模块化JavaScript

捍卫者usb管理控制系统by Mike Groseclose通过Mike Groseclose 捍卫超模块化JavaScript (In Defense of Hyper Modular JavaScript) Last week npmgate was a big topic for the JavaScript community. For those of you who haven’t been following what happened, here’s …

Android开发——布局性能优化的一些技巧(一)

0. 前言上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布局的选择远不如减少布局层级、避免过分绘制、按需加…

1-RAC基础

1 安装 pod ‘ReactiveObjC’ RAC 其实大大减少了代码量 2 基本使用 // 0 RAC 中最为常见的类 信号类/*RACSignal:信号类1.通过RACSignal 创建1个信号(默认:冷信号)2.通过订阅者,订阅信号信号(变成:热信号…

static用法总结

C的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static1、静态全局变量2、静态局部变量3、静态函数二、面向对象的…

小程序 缩放_缩放流星应用程序的初体验

小程序 缩放by Elie Steinbock埃莉斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor App) I recently went through the challenge and ordeal of having to scale my Meteor app. It’s a project that had already been running in …

SQL Server Lock Escalation - 锁升级

Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/questions/12864/what-is-lock-escalation 2008 R2 Lock Escalation (Database Engine)---Forward from Locking in Microsoft SQL Server (Part 12 – Lock Escalation)…

Jzzhu and Chocolate

CF#257 div2 C:http://codeforces.com/contest/450/problem/C 题意:n*m的方格,每次可以横着或者纵向的切一刀,问切k之后,最小的最大是多少。 题解:比赛的时候没有想到怎么处理,看了别人的题解,才…

2-RACommand

RACommand RACCommand 就是命令 // RACCommand 就是命令// 0 创建一个CMD 穿进去一个用于构建RACSignal的Block参数来初始化RACommandRACCommand *cmd [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {// 此处是cmd 执行的输入源NSLog(…

玻璃上的编码喜悦(+ 10史诗般的Epigrams)

by Den McHenry丹麦克亨利(Den McHenry) 玻璃上的编码喜悦( 10史诗般的Epigrams) (Perlis on Coding Joy ( 10 Epic Epigrams)) Alan J. Perlis was the first recipient of the Turing Award. He’s possibly most remembered today for his Epigrams on Programming, which …

【Android】Activity生命周期(亲测)

测试手机:Nexus 5 系统:4.4 一、测试 测试代码: 1 package com.example.androidalarm;2 3 import android.app.Activity;4 import android.content.Context;5 import android.content.res.Configuration;6 import android.os.Bundle;7 impo…

angularjs 学习笔记 简单基础

angularjs是谷歌公司的一个项目,弥补了hml在构建方面的不足,通过指令(directive)来扩展html标签,可以使开发者使用html来声明动态内容。 angularjs主要用来开发单页应用(SPA)为主的项目。 angul…

3-RACSignal 常用方法

RACSingal的常用方法 一 基本使用 1map // 0 创建信号提供者// RACSubject,既能发送信号,又能订阅信号// 多用于代理,相当于OC里的delegate或者回调blockRACSubject *subject [RACSubject subject];// 1 绑定信号RACSignal *bindSignal …

javascript迭代_探索JavaScript迭代

javascript迭代by Festus K. Yangani由Festus K.Yangani 探索JavaScript迭代 (Exploring JavaScript Iteration) Loops allow programs to perform repetitive tasks, such as iterating through an array, while adhering to the DRY principle (Don’t Repeat Yourself). Th…

4 RACMulticastConnection 连接类

# RACMulticastConnection信号被多次订阅如果一个信号多次被订阅&#xff0c;那么代码块代码会多次被执行。objective-c// 创建信号RACSignal *sg1 [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {NSLog("网络请求…

ie6下常见的bug 调整页面兼容性

ie6下常见的bug 我们布局页面&#xff0c;首先符合标准&#xff0c;如何写一个页面的标准性&#xff1f; 但是ie6等浏览器本身就比较特殊&#xff0c;bug比较多&#xff0c;兵法云&#xff0c;知己知彼百战百胜。我们需要了解ie6的一些常见bug&#xff0c;这样&#xff0c;更好…

Cacti安装详细步骤

Cacti安装详细步骤 前提LNMP或LAMP架构已搭建完成 一、cacti概述 1. cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool储存和更新数据&#xff0c;当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此&#xff0…