Swift 函数

函数定义

函数的定义包括必要的 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358