本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考
以下还是有很多没看懂、不确定的地方,我会以“存疑”的注解指出。
在此感谢中文版翻译者,这极大地加快了 Swift 的学习速度。
本文地址:https://segmentfault.com/a/1190000008456636
Reference:
原版:The Swift Programming Language
中文版:Swift 3 编程语言 - 函数
函数的基本知识在序言已经讲了,这里不重复。只是提一下少数进阶的功能。
可选返回类型
如果一个函数的返回值的任一部分有可能是 nil
,那么需要加上问号。比如:
func someFunc (array: [Int]) -> (min: Int, max: Int)? {
...
}
注意 (Int, Int)?
和 (Int?, Int?)
的含义是不同的。
形参和实参
在 C 里面,一个函数在声明的时候,可以只声明函数参数的类型,而不声明其名字。另外,也可以在声明的时候为参数指定名字,使得语义更加明确。而在函数实际使用(定义)的时候,你可以重新命名相应的参数名,便于实际的函数实现。在 Swift
中也支持这样的写法。
Swift
的声明和定义实际上是在一块儿的,所以你需要在定义的时候同时指定形式参数和实际参数。每一个参数按照 “形式参数 实际参数: 类型
” 的格式来写。如果形式参数是空的,那么就用 “_
” 表示。这样便于 IDE 识别。
比如有以下几个写法:
// 完全没有形式参数,非常的 C-style
func isLeftGreaterThanRight(_ left: Int, _ right: Int) -> Bool {...}
// 这个例子我觉得可以说明形参和实参的区别所在,是不是很像 Objective-C 的方法名?
func isNumber(_ left: Int, greaterThan right: Int) -> Bool {...}
// 或者全部定义完全,个人觉得这个定义比较疯狂……
func check(number left: Int, isGreaterThan right: Int) -> Bool {...}
可变参数
Swift
中的可变参数和 C
不一样。C
的可变参数经常用于实现字符串填充功能(其实理论上是可以做更多)。
但是 Swift
里的可变参数实际上只是一个语法糖而已,其作用是将多个同类型的参数帮你拼接成 Array 类型作为参数
。使用 “...
” 表示可变参数。比如:
func sum (numbers: Double) -> Double {
var ret = 0.0
for eachNum in numbers {
ret += eachNum
}
return ret
}
“输入输出” 形式参数
这里类似于 C 里面讲到指针时的地址引用,使用的也是相同的例子:
func swap (_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
注意上面的 inout
关键字。调用的方法是:swap(&numA, &numB)
,是不是很像 C 里的取地址?
变量类型:“函数”
就像 C 一样,函数也可以成为一个变量类型。Swift
因为没有函数指针的概念,所以函数类型的定义实际上变得很明确。
比如函数 func someFunc(_ a: Int, _ b: Int) -> Int{...}
的类型就是 (Int, Int) -> Int
。这就是一个数据类型了,称为 “函数类型”,可以用来定义变量!比如:
var someFuncVal : (Int, Int) -> Int = someFunc
调用的方式是:someFuncVal(1, 2)
,比 C 里还要纠结 “*
” 号好多了!
函数类型的变量也可能用来作为函数变量或者是函数返回值,这个时候就会出现很多个 “->
”。这里就不展开了,我隐约嗅到了混乱 Swift 的味道……
函数内嵌
函数的内部可以再定义一个函数,有点像 Objective-C 里面的 “代码块” 的作用。这里也很好理解,不展开
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。