1.函数的概念:完成某个特定任务的代码块,给代码块起一个合适的名字,即函数名,简单的说,当函数需要被执行的时候,调用这个名字就可以了。
2.Swift中函数定义的语法:
func 函数名 (参数名:参数类型) -> 函数返回值类型{
函数的实现代码
}
简单的函数实例:
无参数无返回值
func welcome(){
print("欢迎");
}
调用方式welcome()
有参数有返回值
func Add(x : Int, y : Int) -> Int{
return x + y;
}
可以这样调用Add(x: 10, y: 20);
返回值即为30
函数带有默认值
func Add(x : Int, y : Int = 2) -> Int{
return x + y;
}
我们在调用的时候可以不传如y
的值Add(x: 20)
,如果我们需要更改y
的值,那么可以这样调用Add(x: 20, y: 3)
参数带有函数
func Add(x : Int, y : Int, method : (Int, Int) -> Int) -> Int{
return method(x, y);
}
func NewAdd(x : Int, y : Int) -> Int{
return x + y;
}
这个函数要求我们传入两个int
类型的参数和一个带有两个int
类型参数的函数。我们可以这样调用Add(x : 10, y : 20, method : NewAdd(x:y:))
在函数的执行过程中,Add
函数会将它的两个参数传入到NewAdd
函数中进行处理,最后,将处理的结果返回。
返回值为函数
func makeIncrementer() -> ((Int) -> Int){
func addOne(number : Int) -> Int{
return 1 + number;
}
return addOne;
}
函数是第一等类型,这意味着函数可以作为另一个函数的返回值。makeIncrementer
方法返回一个函数。我们定义一个变量来接收返回的参数var increment = makeIncrementer()
并使用它increment(7)
我们也可以简单地书写makeIncrementer()(7)
函数的其他方形式:
函数的参数标签
func greets(_ person : String, on day : String) -> String{
return "hello \(person), today is\(day)";
}
默认情况下,函数使用它们的参数名称作为参数的标签,在参数名称前可自己定义参数标签,或者使用_
表示不使用参数标签,调用如下greets("GeYang", on: "Wednesday")
使用数组来让函数返回多个值
func calculateStatistics(scores : [Int]) -> (min : Int, max : Int, sum : Int){
var min = scores[0];
var max = scores[0];
var sum = 0;
for score in scores {
if score > max{
max = score;
}else if score < min{
min = score;
}
sum += score;
}
return(min, max, sum);
}
我们可以使用数组来让一个函数返回多个值,该数组的元素可以用名称或者数字来表示,我们定义一个常量来接收返回结果let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
,获取值statistics.sum
statistics.max
,或者使用下标获取值statistics.2
可变参数的函数
func sumof(number : Int...) -> Int{
var sum = 0;
for num in number {
sum += num;
}
return sum;
}
函数可以带可变个数的参数,这些参数在函数内表现为数组形式sumof(number: 1, 2, 3)
或 sumof(number: 1, 2, 3, 4, 5)
带有inout关键字的参数
func swapTwoInts(_ a: inout Int, _ b : inout Int){
let tempoaryA = a;
a = b;
b = tempoaryA;
}
var someInt = 3;
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt);
首先我们需要了解两个概念值类型
与引用类型
, 值类型
传递的是参数的一个副本,这样在调用参数的过程中不会影响原始数据。引用类型
把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据。
在声明函数时,在参数前面用 inout
修饰,函数内部实现改变外部参数。
所以,在执行完上述方法后,someInt
的值为107,而anotherInt
的值为3,相当于C语言中的地址传递