Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

7.4  函数参数的特殊情况

声明定义有参函数时,为函数的每一个参数都定义了参数名称。根据参数名定义的形式不同,函数参数包括本地参数和外部参数名两种本文选自swift入门很简单。

7.4.1  本地参数名

本地参数名就是定义函数名时,在参数列表中所写的参数名,它只可以在函数主体内使用。如以下的一个代码片段,它定义了一个函数名为fun的函数,在此函数的参数列表中定义的就是本地参数名文选自swift入门很简单。

  • func fun(start:Int,end:Int,str:String){
  • ……
  • }

在以上的代码中,定义的参数名start、end、str都是本地参数名。它只可以在函数本身的代码中使用,在调用时就不可以使用了。

7.4.2  外部参数名

在函数中,如果每一个参数的目的不是很明确或者是含糊不清的,那么对于其他开发者来说,是很难理解参数的目的。例如下面的代码,它是一个具有字符串连接功能的函数,代码如下文选自swift入门很简单:

  • func join(s1: String, s2: String, s3: String) {
  • println("\(s1)\(s3)\(s2)")
  • }
  • join("hello","world",",")

对于这么一个函数来说,参数s1、s2、s3只知道是三个字符串,但是涉及到每一个参数的具体目的,就不是很容易理解了。为了解决这一难题,Swift提供了外部参数名称。外部参数和本地参数的定义是一样的。但是如果开发者需要更好的表达参数的功能,需要在定义时使用外部参数名。外部参数名需要写在本地参数名之前,并使用空格将其分开。它的一般形式如下:

  • func 函数名(外部参数名 本地参数名:数据类型){
  • ……
  • }

对于外部参数名的函数,调用形式如下:

  • 函数名(外部参数名:参数值)

【示例7-7】以下示例为具有字符串连接功能的函数定义外部参数。代码如下:

  • func join(string s1: String,tostring s2: String, joiner s3: String) {
  • println("\(s1)\(s3)\(s2)")
  • }
  • join(string: "Hello", tostring: "Swift", joiner: ",")
  • 其中,string、tostring、joiner都是外部参数名。运行结果如下:
  • Hello,Swift
  • Program ended with exit code: 0

这里需要注意以下三点:

(1)调用时使用外部参数:如果为参数提供了一个外部参数名后,需要在调用该函数的同时使用外部参数名。否则,程序就会提示错误。例如下面的具有字符串连接功能的函数调用代码文选自swift入门很简单:

  • join("Hello", "Swift",  ",")

由于在上方的代码中没有使用外部参数名string、tostring、joiner,所以出现了以下的错误提示:

  • Missing argument labels 'string:tostring:joiner:' in call

(2)参数的顺序:使用外部参数名可以很好的让其他开发者理解各个参数的目的,但是它的调用顺序也必须要和定义声明函数时的一致。例如以下代码调用具有字符串连接功能的函数:

  • join(tostring: "Swift",string: "Hello", joiner: ",")

在声明定义函数时参数的顺序为(string,tostring, joiner),而在调用时顺序为(tostring, string,joiner)。由于顺序不一样,导致程序出现以下的错误信息:

  • Argument 'string' must precede argument 'tostring'

(3)外部参数名称的快速写法:如果开发者想要为函数的参数提供一个外部参数名,然而本地参数名已经使用了一个合适的名称,这时就不需要再为该参数写相同的两次名称了。取而代之的是,写一次名称,并用一个“#”号作为名称的前缀。它会告诉编译器,这里使用该名称作为本地参数名和外部参数名。其一般的形式如下:

  • func 函数名(#本地参数名:数据类型){
  • ……
  • }

【示例7-8】以下程序实现字符串连接功能,外部参数名的定义使用了“#”号。代码如下文选自swift入门很简单:

  • import Foundation
  • func join(#string:String, #tostring: String, #withJoiner:String) {
  • println("\(string)\(withJoiner)\(tostring)")
  • }
  • join(string: "hello", tostring: "world", withJoiner: ", ")

虽然定义的时候可以使用“#”简写,但是调用的时候必须写完整的外部参数名。

7.4.3  设定参数默认值

在定义函数的时候,可以为参数设定默认值。这样,在调用的时候,就不用再传递该参数的值。

【示例7-9】以下的代码就为start和end参数分别定义了默认值0和5,其功能是输出0到5的数值。代码如下:

  • import Foundation
  • //声明定义函数
  • func fun(start:Int=0,end:Int=5){
  • var i=start
  • for i;i<=end;++i{
  •         println(i)
  •     }
  • }
  • fun()                                                                  //调用

代码中,函数fun()调用的时候没有传递任何参数值。这是由于定义函数fun()时参数start和end都有默认值,所以调用的时候就可以不传递参数。运行结果如下所示文选自swift入门很简单:

  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • Program ended with exit code: 0

注意:在使用默认值是需要注意以下几点:

(1)定义时,将使用默认值的参数放在函数的参数列表的末尾。这确保了调用函数时候, 不会因为省略参数值而影响不具备默认值的参数的顺序。

(2)调用时,如果参数的默认值已经被设置,可以省略该参数的传值。

(3)如果开发者设定了默认值,但在调用时想要改变默认值,也可以继续赋值。

【示例7-10】以下代码输出3到8之间的数值,包括3和8。代码如下:

  • import Foundation
  • func fun(start:Int=0,end:Int=3){
  • var i=start
  • for i;i<=end;++i{
  • println(i)
  • }
  • }
  • println("使用默认值范围")
  • fun()
  • println("使用改变后的范围")
  • fun(start:3,end:8)                                                                               //改变了默认值

在代码中,第一次调用使用了参数的默认值,第二次调用改变了参数的默认值。运行结果如下文选自swift入门很简单:

  • 使用默认值范围
  • 0
  • 1
  • 2
  • 3
  • 使用改变后的范围
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Program ended with exit code: 0

在为参数设定默认值后,Swift会自动为该参数提供了同名的外部参数名。如果调用时需要改变默认值,必须使用外部参数,不能直接赋值。否则,就会出现错误,如以下的代码:

  • fun(3,8)

在此代码中,对start和end进行了直接赋值,所以导致程序错误,其错误信息如下所示文选自swift入门很简单:

  • Missing argument labels 'start:end:' in call

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名的更多相关文章

  1. Swift函数_外部参数名,

    //1________________ /** *没使用外部参数名的函数 */ func inputScore(name:String,score1:Int,score2:Int) { } /** * ...

  2. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. OC与Swift的区别五(函数)

    13 函数 oc函数定义: 返回值类型 函数名(参数类型 参数名,参数类型 参数名){ } swift 函数定义: func 函数名(参数名:参数类型,参数名:参数类型) -> 返回值类型{ } ...

  4. 空函数有参函数调用参数的注意事项Swift 1.1语言

    空函数有参函数调用参数的注意事项Swift 1.1语言 7.2.3  空函数 空函数有参函数调用参数的注意事项Swift 1.1语言空函数是函数中最简单的形式.在空函数中,函数只有一个空壳,里面是没有 ...

  5. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  6. [转]深度探索C语言函数可变长参数

    转自:http://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html 一.基础部分 1.1 什么是可变长参数 可变长参数:顾名 ...

  7. C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

    上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇 ...

  8. C语言函数不定参数实现方式

    函数如何实现不定参数: 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. (1)va_ ...

  9. C语言函数篇(二)函数参数基础设计

    形参实现一种数据传入的接口 ,由 实参 拷贝给 形参. 拷贝!!!!!!!!!!! 例1: void func(int tmp){ //意图是实现传进来的参数 +1 tmp++; } int mian ...

随机推荐

  1. Altera的几个常用的Synthesis attributes

    各厂商综合工具,对HDL综合时都定义了一些综合属性这些属性可指定a declaration,a module item,a statement, or a port connection 不同的综合方 ...

  2. HDOJ 2089 不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. Hadoop之伪分布环境搭建

    搭建伪分布环境 上传hadoop2.7.0编译后的包并解压到/zzy目录下 mkdir /zzy 解压 tar -zxvf hadoop.2.7.0.tar.gz -C /zzy     配置hado ...

  4. 2012年湖南省程序设计竞赛E题 最短的名字

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 解题报告:输入n个字符串,让你求出可以用来区别这些字符串的最少的前缀总共有多少个字 ...

  5. [Effective JavaScript 笔记]第25条:使用bind方法提取具有确定接收者的方法

    js里方法和属性值为函数,就像一个东西两种称呼一个样,比如土豆,也叫马铃薯,一个样.既然一样,那就可以对对象的方法提取出来为函数,然后把提取出来的函数作为回调函数直接传递给高阶函数. 高阶函数是什么 ...

  6. 第19章 使用PXE+Kickstart部署无人值守安装

    章节概述: 本章节将教会您通过PXE+DHCP+TFTP+VSftpd+Kickstart服务程序搭建出无人值守安装系统,从而批量部署客户机系统. 这种系统能够实现自动化运维.避免了重复性劳动,帮助提 ...

  7. 3ds Max光照纹理导入Unity的教程.

    原地址:http://www.cocoachina.com/gamedev/gameengine/2010/0531/1581.html 相信这个3ds Max光照纹理导入Unity的教程对游戏设计师 ...

  8. 关于windows程序的学习及思考系列之一

    1.窗口类的注册 a.windows程序中最简单的就是创建一个简单的窗口,而窗口程序的创建是基于窗口类的,窗口类决定了处理窗口消息的过程函数. b.一个窗口类可以用于创建多个窗口,也就是说窗口是窗口类 ...

  9. 在Windows Server 2012 中安装 .NET 3.5 Framework

    问题 如今,仍然有许多程序和应用需要依靠.NET 3.5 framework 来运行.在Windows Server 2012中,微软提供了.NET 3.5 和.NET 4.5的安装选项以为你的应用程 ...

  10. Linux 磁盘的组成

    基本结构 磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息. 每个磁道被分成许多扇形的区域,每个区域叫一个 ...