函数定义
函数的定义包括必要的 func
关键字以及函数名,可选带有参数以及返回值。其中参数可选带有 参数标签
,即:
func name(paramLabel paramName: paramType){ statement }
其中参数标签可以省略,上式可以改写成:
func name(paramName: paramType){ statement }
注意:省略了参数标签则默认使用 参数名(paramName)
当做参数标签
// 无参数,无返回值
func name0() {
}
// 无参数,有返回值
func name1() -> Int {
return 0
}
// 有参数,无返回值
func name2(parm0:Int, parm1:String) {
}
// 有参数,有返回值
func name3(parm0:Int, parm1:String) -> Int {
return 0
}
// 不省略参数标签
func name4(paramLabel paramName: Int) {
}
函数调用传参
格式为:
函数名(参数1标签 : 参数1的值, 参数2标签: 参数2的值)
let b = name3(parm0: 0, parm1: "hello")
上面的代码使用了默认的参数标签,即参数名 parm0
如果不想要参数标签,则在定义的时候需在参数标签显式定义为 _
func name5(_ parm0:Int, _ parm1:String, parm2:Int) {
}
name5(0, "dude", parm2: 1)
这样 parm0
和 parm1
在调用的时候都不需要参数标签,直接传入参数值即可。
参数默认值
有的时候,希望调用方法的时候不传值也会有一个默认值,这时候只需要定义函数时候在该参数后面加上 =默认值
即可
func adoptPet(pet: String = "cat") {
print("Adopt \(pet) success!")
}
adoptPet(pet: "dog")
adoptPet() // 不传参数,则默认是 cat
输出:
Adopt dog success!
Adopt cat success!
不定参数(可变参数)
不定参数是指 已知参数的类型,但是不确定参数的个数。
在参数类型后加 ...
来表示
func GreaterThan5(numbers: Int...) {
for number in numbers {
if (number > 5) {
print("\(number)")
}
}
}
调用和一般传参一样,但是使用 ,
隔开多个参数
GreaterThan5(numbers: 0, 1, 2, 4, 5, 6, 7)
输出
6
7
函数重载
函数重载的定义: 函数名相同,参数不同
这里的 参数不同
,理解为: 参数名不同可以类型相同是参数不同,参数名相同类型不同也是参数不同
func initialize() {
}
func initialize(parm: Int) {
}
func initialize(parm_another: Int) {
}
func initialize(parm: String) {
}
引申:
但是在 OC 中却不可以函数重载,因为 OC 中是使用 @selector
去寻找方法的,即 - (void)func:(int)a
和 - (void)func:(NSString *)b
都是 @selector(func:)
。因此指向的是同一个。
函数多态 (重写)
Swift 中使用 override
来重写父类函数,实现多态
class AClass {
func name0() {
print("a")
}
}
class BClass: AClass {
override func name0() {
print("b")
}
}
let aIns = AClass()
aIns.name0()
let bIns = BClass()
bIns.name0()
输出
a
b
传递引用参数 (函数内部修改外部变量的值)
在函数内部的作用域中修改参数,只在函数内部修改有效,当函数返回之后,该形参实际上还是原来的值。
实际上我们无法模拟在函数中修改形参的值,因为,Swift 中的形参是不可变的,相当于是使用 let
声明的一个变量。
如果说我们要实现在函数内部去修改这个值,使函数在返回后修改依然有效,则需要将该参数的地址传入,使用 inout
关键字
func add1(num: inout Int) {
num += 1
}
注意 inout
是放在类型 Int
前面的,类似 C 中的 *int
,表达的意思是:num 这个参数是一个地址,指向的区域存着一个 Int 类型的东西
但是在函数的内部取值则不需要像 C 一样使用 *num
,直接使用 num
即可,得益于编译器优化。
调用的时候使用 &
传递该变量的地址即可:
var a = 0
add1(num: &a)
print("Outside: \(a)")
输出
Outside: 1