iOS开发Swift篇—(八)函数(2)

iOS开发Swift篇—(八)函数(2)

一、函数类型

函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是

(形参类型列表) -> 返回值类型

1 func sum(num1: Int, num2: Int) -> Int {
2     return num1 + num2
3 }

sum函数的函数类型是(Int, Int) -> Int

1 func printLine()
2 {
3     println("-----------")
4 }

printLine函数的函数类型有4种表示方法

(1)Void -> Void 

(2)() -> ()

(3)Void -> ()

(4)() -> Void

 

二、利用函数类型定义变量

可以利用函数类型来定义变量,将来可以存储这种类型的函数

1 func sum(num1: Int, num2: Int) -> Int {
2     return num1 + num2
3 }
4 var fn: (Int, Int) -> Int = sum
5 fn(10, 20) // 返回30

由于Swift有类型推断机制,因此,也可以这么写

  var fn = sum   // fn以后所存储函数的类型就必须是(Int, Int) -> Int

 

三、函数作为参数

跟其他数据类型一样,函数也能当函数的参数

1 func printResult(fn: (Int, Int) -> Int, num1: Int, num2: Int) 
2 {
3     println("运算结果是:%d", fn(num1, num2))
4 }

fn参数接收一个函数,这个函数必须返回Int、有2个Int类型的参数

1 func sum(num1: Int, num2: Int) -> Int {
2     return num1 + num2
3 }
4 func minus(num1: Int, num2: Int) -> Int {
5     return num1 - num2
6 }
7 printResult(sum, 20, 10) // 30
8 printResult(minus, 20, 10) // 10

 

四、函数作为返回值

跟其他数据类型一样,函数也能当函数的返回值

 1 func goToWork() { println("去上班") }
 2 func playFootball() { println("踢足球") }
 3 func howToDo(day: Int) -> () -> () {
 4     if day < 6 {
 5         return goToWork
 6     } else {
 7         return playFootball
 8     }
 9 }
10 var fn = howToDo(7)
11 fn() 
12 // 踢足球

 

五、函数重载

函数重载:函数名相同,函数类型不同

下面的2个函数构成重载

(1)函数名:sum,函数类型:(Int, Int) -> Int

1 func sum(num1: Int, num2: Int) -> Int {
2     return num1 + num2
3 }

(2)函数名:sum,函数类型:(Int, Int, Int) -> Int

1 func sum(num1: Int, num2: Int, num3: Int) -> Int {
2     return num1 + num2 + num3
3 }

 

六、嵌套函数

全局函数:在全局作用域中定义的函数

嵌套函数:在某个函数体中定义的函数

代码示例:

 1 func howToDo(day: Int) -> () -> () {
 2     func goToWork() { println("去上班") }
 3     func playFootball() { println("踢足球") }
 4     if day < 6 {
 5         return goToWork
 6     } else { return playFootball }
 7 }
 8 var fn = howToDo(5)
 9 fn() // 去上班
10 goToWork() 

 注意:第10行是错误写法,嵌套函数的作用域仅限于定义嵌套函数的函数体内部

iOS开发Swift篇—(八)函数(2),,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。