Swift 函数

2019-07-23  本文已影响0人  kimedison

函数定义

函数的定义包括必要的 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)

这样 parm0parm1 在调用的时候都不需要参数标签,直接传入参数值即可。

参数默认值

有的时候,希望调用方法的时候不传值也会有一个默认值,这时候只需要定义函数时候在该参数后面加上 =默认值 即可

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
上一篇 下一篇

猜你喜欢

热点阅读