Swift2.0语言教程之函数的返回值与函数类型

Swift2.0中函数的返回值

根据是否具有返回值,函数可以分为无返回值函数和有返回值函数。以下将会对这两种函数类型进行讲解。

Swift2.0中具有一个返回值的函数

开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回。其中,return语句的一般表示形式如下:

  • return 表达式

其中,表达式可以是符合Swift标准的任意表达式。而具有返回值的函数声明定义形式如下:

  • func 函数名(参数列表)->返回值类型{
  • 语句
  • return 表达式
  • }

其中,返回的表达式类型必须和函数的返回值类型一致。

【示例7-13】以下代码计算某一数值范围的长度,并返回输出。代码如下:

  • import Foundation
  • func range(start:Int,end:Int)->Int{
  •   return end-start                    
  • }
  • let a=range(0, end: 10)
  • print(a)

在代码中,指定函数的返回值类型为Int,而return表达式为end-start。运行结果如下所示:

  • 10

Swift2.0中具有多个返回值的函数

在Swift中,函数不仅可以返回一个返回值,还可以返回多个,这时就需要使用到元组类型。其语法形式如下:

  • func count(参数列表) -> (返回值1:数据类型, 返回值2:数据类型, 返回值3:数据类型,…) {
  • ……
  •  return (返回值1,返回值2,返回值3,…)
  • }

【示例7-14】下面就获取在一个字符串中得元音、辅音以及其它的个数。代码如下:

  • import Foundation
  • func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
  • var vowels = 0, consonants = 0, others = 0
  • for character in string.characters  {
  • switch String(character).lowercaseString {
  • case "a", "e", "i", "o", "u":
  • ++vowels
  • case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
  • "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
  • ++consonants
  • default:
  • ++others
  • }
  • }
  •  return (vowels, consonants, others)
  • }
  • let str="Hello Swift!"
  • let number=count(str)
  • print("\(number.vowels)元音\n\(number.consonants)辅音\n\(number.others)其它")

运行结果如下所示:

  • 3元音
  • 7辅音
  • 2其它

在具有多个返回值的函数需要注意以下2点:

1.返回值个数一致

在->后面的返回值类型的个数要和return中的返回值个数一致,否则程序就会出现错误。如以下的代码,将示例7-14中的代码做了修改:

  • func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
  • var vowels = 0, consonants = 0, others = 0
  • return (vowels, consonants)
  • }

在此代码中可以知道,->后面的返回值类型有3个,但是return中得返回值有2个,它们的个数不一样,导致程序出现以下的错误:

Tuple types '(@lvalue Int, @lvalue Int)' and '(vowels: Int, consonants: Int, others: Int)' have a different number of elements (2 vs. 3)

2.返回值顺序

在->后面的返回值类型要和return中的返回值类型的顺序一致,否则程序就会出现错误。如以下的代码,将示例7-14中的代码做了修改:

  • func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
  • var vowels = 0, consonants = 0, others = 0
  • return (vowels,others,consonants)
  • }

在此代码中,->后面的返回值为(vowels: Int, consonants: Int, others: Int),return中的返回值为(vowels,others,consonants)由于它们的数据类型相同都是整型,所以在改变它们的位置后,程序不会出现错误。运行结构如下:

  • 3元音
  • 2辅音
  • 7其它

Swift2.0中无返回值

函数除了有有返回值类型外,还有没有返回值的类型。在第7.2、7.3、7.4节中所讲的都是没有返回值的函数类型。没有返回值的类型不需要定义返回值类型,并且也不需要出现return语句。如果出现return语句,反而会造成程序错误。例如以下的代码,它的功能是输出某一数字。

  • import Foundation
  • func printaa(a:Int){
  •  return a
  • }
  • let num=9
  • let number=printaa(num)
  • print(number)

在此函数中,它是没有返回值的,但是在函数中又使用了renturn语句返回了a的值,所以导致程序出现了以下的错误信息:

  • 'Int' is not convertible to '()'

Swift2.0中函数类型

在Swift中,每一个函数都是一个特定的类型,这种类型被称为函数类型。它由参数类型和返回值类型构成。例如以下代码就是一个具有参数类型和返回值类型的函数:

  • func add(a: Int, b: Int) -> Int {
  • return a + b
  • }

在该代码中,定义了一个实现加法运算的数学函数add。此函数接受了两个Int整型的参数,执行相应的数学运算后,返回一个Int整型值作为结果。这个函数的类型就是(Int,Int)->Int,程序员可以理解为函数类型有两个Int整型参数,并返回一个Int整型值。在Swift除了有具有参数列表和返回值类型的函数外,还有不带参数和返回值类型的函数,如以下代码是一个不带参数和返回值的函数:

  • func printHelloWorld(){
  • print("Hello,World")
  • }

函数printHelloWorld()的类型是()->()。由于函数没有参数,返回void,所以该类型在Swift中相当于一个空元组,也可以简化为()。

Swift2.0中使用函数类型

作为一种类型,程序员可以像任何其他类型一样使用函数类型。基本语法如下:

  • let/var 常量名/变量名:函数类型=函数名
  • 或者
  • let/var 常量名/变量名=函数名

【示例7-15】以下将使用一个mathFunction变量引用函数add。代码如下:

  • import Foundation
  • func add(a: Int, b: Int) -> Int {
  • return a + b
  • }
  • var mathFunction: (Int, Int) -> Int = add
  • print(mathFunction(2,8))

在代码中定义了一个mathFunction变量,并将该变量的类型设定为函数类型。它接受了两个Int整型值,并返回了一个Int整型值。使用这个新的变量mathFunction来引用add函数的功能。运行结果如下所示:

  • 10

由于Swift具有自动推断类型的能力,所以可以在声明变量后直接赋值,不需要单个为变量去声明类型,所以以上的为变量赋值的代码可以改写为:

  • var mathFunction = add

如果不同函数具有相同的函数类型,这时把它们赋值给同一个变量。例如,在以上的代码中在添加一个函数:

  • func multiply(a:Int,b:Int)->Int{
  • return a*b
  • }

由于mathFunction变量和multiply的类型匹配,所以可以直接赋值,并输出,代码如下:

  • mathFunction=multiply
  • print(mathFunction(3,8))

代码如下所示:

  • 10
  • 24

Swift2.0中使用函数类型作为参数类型

开发者可以使用函数类型作为另一个函数的参数类型。例如以下代码,它的功能是让个数进行相加或者相乘,然后输出。代码如下:

  • import Foundation
  • //两数相加
  • func add(a: Int, b: Int) -> Int {
  • return a + b
  • }
  • //两数相乘
  • func multiply(a:Int,b:Int)->Int{
  • return a*b
  • }
  • //输出结果
  • func printresult(fun:(Int,Int)->Int,a:Int,b:Int){
  • print(fun(a,b))
  • }
  • printresult(add, a: 3, b: 2)
  • printresult(multiply, a: 3, b: 2)

在此代码中定义了三个函数。第三个函数printresult中,有三个参数:第一个参数为fun,类型为(Int,Int)->Int,开发者可以传入任何这种类型的函数;第二个参数和第三个参数分别为a和b,它们的类型都是Int型,这两个值是函数的输入值。当第一次调用printresult函数时,它传入了add函数和3、5两个整数。这时,它又会调用函数add,将3、5作为函数add的输入值,并输出结果。第二此调用也类似,printresult会调用multiply函数。最后的运行结果如下所示:

  • 5
  • 6

Swift2.0中使用函数类型作为返回值类型

函数类型不仅可以被用作参数外,还可以被用作返回值类型。此时需要在->后面写入一个完整的函数类型,其语法形式如下:

  • func 函数名(参数列表) -> 函数类型 {
  • }

【示例7-16】以下代码输出通过给定的值,出现一系列的值;如果给定的值大于0输出从这个数开始到0之间的数;如果是负数,一直输出比这个是小1的数。代码如下:

  • import Foundation
  • //返回一个比输入值大1得值
  • func stepForward(input: Int) -> Int {
  • return input + 1
  • }
  • //返回一个比输入值小1得值
  • func stepBackward(input: Int) -> Int {
  • return input - 1
  • }
  • //选择返回哪个函数
  • func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
  • return backwards ? stepBackward : stepForward
  • }
  • var currentValue = 5
  • let moveNearerToZero = chooseStepFunction(currentValue>0)
  • while currentValue != 0 {
  • print("\(currentValue)... ")
  •  currentValue = moveNearerToZero(currentValue)
  • }

在此代码中定义了3个函数。第三个函数chooseStepFunction的返回值类型是(Int)->Int。运行结果如下所示:

  • 5...
  • 4...
  • 3...
  • 2...
  • 1...
  • Swift2.0中的标准函数

函数除了可以根据参数列表的有无分为无参函数和有参函数,还可以从定义角度分为用户自定义函数和标准函数两种。以上的示例都是用户自定函数。Swift提供了74个标准函数,这些函数都可以直接去使用,不需要进行定义。本节将针对常用的标准函数进行详细的讲解。

Swift2.0中绝对值函数abs()

abs()函数的功能是求数值的绝对值。其语法形式如下:

  • abs(数值)

函数的返回值是一个零或者正数。

【示例7-17】以下将使用abs()函数获取-10、10、0、-1.233、1.233的绝对值。代码如下:

  • import Foundation
  • //求整数的绝对值
  • let value1=abs(-10)
  • let value2=abs(10)
  • let value3=abs(0)
  • //求浮点数的绝对值
  • let value4=abs(-1.233)
  • let value5=abs(1.233)
  • print("value1=\(value1)")
  • print("value2=\(value2)")
  • print("value3=\(value3)")
  • print("value4=\(value4)")
  • print("value5=\(value5)")

在此代码中,正数的绝对值是它本身;负数的绝对值为正数;0的绝对值还为0。运行结果如下:

  • value1=10
  • value2=10
  • value3=0
  • value4=1.233
  • value5=1.233

注意:abs()中的参数必须是数值,不可以是数值以外的东西,如字符、字符串等。如以下的代码,将获取字符串"aaa"的绝对值。代码如下:

  • import Foundation
  • let value1=abs("aaa")
  • print("value1=\(value1)")

由于abs()的参数为字符串导致程序出现了以下错误:

  • Cannot find an overload for 'abs' that accepts an argument list of type '(String)'

Swift2.0中最大值函数max()/最小值min()

在编程中,经常需要计算几个参数的最大值或者最小值,此时可以使用标准函数中的max()和min()函数实现。以下是对这两个函数的详细讲解。

1.获取最大值

max()函数可以获取几个参数的最大值。其语法形式如下:

  • max(参数1,参数2,参数3,…)

其中,参数可以是数值,也可以是字符串或字符。

【示例7-18】以下将使用max()函数,依次获取1.9和10的最大值,13.8、20、88.88的最大值以及字符串"Hello"、"Swift"、"Zone"的最大值。代码如下:

  • import Foundation
  • let maxValue1=max(1.9,10)
  • let maxValue2=max(13.8,20,88.88)
  • let maxValue3=max("Hello","Swift","Zone")
  • print("maxValue1=\(maxValue1)")
  • print("maxValue2=\(maxValue2)")
  • print("maxValue3=\(maxValue3)")

在对字符串进行比较时,是对字符串中的字符进行比较。首先会判断3个字符的首字符哪个大。如果找到最大的字符,就以此字符开头的字符串为最大值;如果判断的3个首字符相同,那么在进行第二个字符的比较,以此类推。运行结果如下:

  • maxValue1=10.0
  • maxValue2=88.88
  • maxValue3=Zone

2.获取最小值

min()函数可以获取几个参数的最小值。其语法形式如下:

  • min(参数1,参数2,参数3,…)

其中,参数同样可以是数值、字符串或字符。

【示例7-19】以下将使用min()函数,获取1.9和10的最小值,获取13.8、20、88.88的最小值,字符串"Swift"、"Hello"、"iOS"的最小值。代码如下:

  • import Foundation
  • let minValue1=min(1.9,10)
  • let minValue2=min(13.8,20,88.88)
  • let minValue3=min("Swift","Hello","iOS")
  • print("minValue1=\(minValue1)")
  • print("minValue2=\(minValue2)")
  • print("minValue3=\(minValue3)")

运行结果如下:

  • minValue1=1.9
  • minValue2=13.8
  • minValue3=Hello

注意:在使用max()、min()时如果是数值,比较的参数都是数值。如果是字符或者字符串,比较的参数也是字符或者字符串。不可以在一个函数中同时比较数值和字符串、字符。以下的代码将比较1.9、10和字符串"Hello"的最小值。代码如下:

  • import Foundation
  • let minValue=min(1.9,10,"Hello")
  • println("minValue=\(minValue)")

在此代码中,由于min()函数对数值和字符串进行比较,导致程序出现了以下的错误:

  • Cannot find an overload for 'min' that accepts an argument list of type '(Double, Int, String)'

Swift2.0中序列的最大值函数maxElement()/最小值函数minElement()

在一个序列中,往往需要获取元素的最大值或者最小值。此时可以使用maxElement()和minElement()函数。以下是对这两个函数的详细讲解。

1.序列的最大值

maxElement()函数获取一个序列中最大值的元素。其语法形式如下:

  • 序列.maxElement()

其中,序列可以是数值,也可以是一个范围。

【示例7-20】下面使用maxElement()函数获取序列sequence1、sequence2和范围1...100中最大值的元素。代码如下:

  • import Foundation
  • let sequence1=[9,8,2,3]
  • let sequence2=["Ad","Ab","Ac"]
  • let maxValue1=sequence1.maxElement()!
  • print("maxValue1=\(maxValue1)")
  • let maxValue2=(1...100).maxElement()!
  • print("maxValue2=\(maxValue2)")
  • let maxValue3=sequence2.maxElement()!
  • print("maxValue3=\(maxValue3)")

其中,字符串构成的序列sequence2的判断方式与函数max()相同,都是依次比较字符串的字母大小。运行结果如下:

  • maxValue1=9
  • maxValue2=100
  • maxValue3=Ad

2.序列的最小值

minElement()函数可以获取一个序列中最小值的元素。其语法形式如下:

序列.minElement()

其中,序列可以是数值,也可以是一个范围。

【示例7-21】以下将使用minElement()函数获取序列sequence1、sequence2和范围1...100中最小值的元素。代码如下:

  • import Foundation
  • let sequence1=[9,8,2,3]
  • let sequence2=["Ad","Ab","Ac"]
  • let minValue1=sequence1.minElement()!
  • print("minValue1=\(minValue1)")
  • let minValue2=(1...100).minElement()!
  • print("minValue2=\(minValue2)")
  • let minValue3=sequence2.minElement()!
  • print("minValue3=\(minValue3)")

运行结果如下:

  • minValue1=2
  • minValue2=1
  • minValue3=Ab

Swift2.0中判断序列是否包含指定元素函数contains()

contains()函数可以判断一个序列中是否包含指定的元素。其语法形式如下:

  • 序列.contains(元素)

其中,函数的返回值类型为布尔类型。当返回true时,表示表达序列中包含指定的元素;当返回false时,表示不包含。

【示例7-22】以下代码使用contains()函数函数判断序列languages中是否包含元素"Swift"和"Java"。代码如下:

  • import Foundation
  • var languages = ["Swift", "Objective-C","C"]
  • //判断在languages数组中是否包含"Swift"字符串
  • if languages.contains("Swift") == true  {
  • print("languages序列中包含元素“Swift”")
  • }else{
  • print("languages序列中不包含元素“Swift”")
  • }
  • //判断在languages数组中是否包含"Java"字符串
  • if languages.contains("Java") == true  {
  • print("languages序列中包含元素“Java”")
  • }else{
  • print("languages序列中不包含元素“Java”")
  • }

在此代码languages中"Swift"、"Objective-C"、"C"这三个元素,但是没有"Java"元素。运行结果如下:

  • languages序列中包含元素“Swift”
  • languages序列中不包含元素“Java”

在比较的时候,会区分字母的大小写。所以,不同大小写的字符串是不同的。

Swift2.0序列排序函数sortInPlace()

在编程中,经常需要对序列中元素的进行排序。此时可以使用Swift中的sortInPlace()函数来实现。其语法形式如下:

  • 序列.sortInPlace()

其中,序列是指数组。

【示例7-23】以下将使用sort()函数对languages和value数组进行排序。代码如下:

  • import Foundation
  • var languages = ["Swift", "Objective-C","C"]
  • print("排序前:languages=\(languages)")
  • languages.sortInPlace()
  • print("排序后:languages=\(languages)")

运行结果如下:

  • 排序前:languages=[Swift, Objective-C, C]
  • 排序后:languages=[C, Objective-C, Swift]

Swift2.0序列倒序函数reverse()

reverse()函数可以将序列中元素的倒序排列。其语法形式如下:

  • 序列.reverse()

其中,序列是指数组。

【示例7-24】以下将使用reverse 函数对序列languages和value进行倒序排列。代码如下:

  • import Foundation
  • var languages = ["Swift", "Objective-C","C"]
  • print("languages=\(languages)")
  • print("倒序输出:")
  • for i in Array(languages.reverse()){
  • print(i)
  • }
  • var value = [1,8,4,10]
  • print("value=\(value)")
  • print("倒序输出:")
  • for i in Array(value.reverse()){
  •     print(i)
  • }

运行结果如下:

  • languages=[Swift, Objective-C, C]

倒序输出:

  • C
  • Objective-C
  • Swift
  • value=[1, 8, 4, 10]

倒序输出:

  • 10
  • 4
  • 8
  • 1

本文选自:Swift2.0语言快速入门v3.0 大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

Swift2.0语言教程之函数的返回值与函数类型的更多相关文章

  1. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...

  2. Swift2.0语言教程之类的方法

    Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和O ...

  3. Swift2.0语言教程之类的属性

    Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...

  4. Swift2.0语言教程之闭包

    Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语 ...

  5. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  6. Swift2.0语言教程之下标脚本

    Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...

  7. python -- 初始函数 函数的定义,函数的返回值以及函数的参数

    1.什么是函数,函数的定义及语法 2.函数的返回值 3.函数的参数 一.函数的定义及语法 函数的定义:定义了一个动作或者功能,是对功能的封装 语法: def 函数名( 形参列表 ):          ...

  8. Python_函数的初识、函数的返回值、函数的参数

    1.函数的初识 def关键字 空格 函数名(与变量名命名规则相同):英文冒号 函数体 执行函数:函数名+() 函数是以功能为导向的. def login(): pass def register(): ...

  9. python27期day09:函数的初始、函数的定义、函数的调用、函数的返回值、函数的参数、作业题。

    1.函数的作用:封装代码.大量的减少了重复的代码. 2.全局空间:顶行写的就是全局空间. 图解 : 3.函数的定义: def 是一个关键字.申明要定义一个函数 my_len 函数的名字.遵循变量命名的 ...

随机推荐

  1. 【leetcode 简单】 第八十六题 有效的完全平方数

    给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False. 注意:不要使用任何内置的库函数,如  sqrt. 示例 1: 输入: 16 输出: Tr ...

  2. 【leetcode 简单】 第八十题 3的幂

    给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...

  3. 倍增 Tarjan 求LCA

                                                                                                         ...

  4. sklearn_模型遍历

    # _*_ coding = utf_8 _*_ import matplotlib.pyplot as plt import seaborn as sns import pandas as pd f ...

  5. 软件测试工程师人手必备的一只:TOM猫,可以带你装逼带你飞!

    Hi,你来了? 其实没有猫,为了让你们好好学习,天天向上!我可真的是拼了命了! 写这篇文章的缘由是,近期有同学经常问到一个这样的问题: 老师,tomcat是啥? 老师,Linux是啥? 老师,xshe ...

  6. C# TreeView 自定义显示checkbox

    本项目需要对TreeView进行定制,要求比较简单,主要要求如下: Winform中TreeView控件默认只支持所有级别的CheckBox显示或者不显示,不能控制制定Level的树节点显示 效果如下 ...

  7. 关于getsockname()/getpeername()函数第一次被调用得到0.0.0.0结果的说明

    最近阅读UNIX网络编程第四章时,书本末尾介绍了两个函数getsockname()和getpeername(),可以用于获取服务器端和客户端的IP地址与端口,原本很简单的两个函数,过一眼即明白函数的用 ...

  8. linux下补丁制作及打补丁实例【转】

    转自:http://www.latelee.org/using-gnu-linux/diff-and-patch-on-linux.html 搞ARM有一段时日了,期间看了不少开发板的手册,手册的内容 ...

  9. TableView 的那些坑

    1. 分割线填满cell宽度, 并且设置分割线的颜色 1.1 利用系统的分割线填充 1.1.1 tableView 设置如下属性 // 给tableView设置如下属性值 tableView.layo ...

  10. 如何在线预览github上的html页面?

    可以通过http://htmlpreview.github.io/这个网站,直接在线预览html页面. ↓    ↓ 可以发现:这个网站直接将github上的页面地址当做参数来传递.