函数

一. swift函数允许用元组作为返回值,以达到函数返回多个值的目的。

// 用元祖作为函数返回值
func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

注意点:

  • minMax函数返回了一个包含两个 Int 值的元组。但是函数不会对传入数组执行任何安全检查,如果 array 参数是一个空数组,那么minMax在试图访问 array[0] 时会触发一个运行时错误(runtime error)。为了安全地处理这个“空数组”问题,将 minMax(_:) 函数改写为使用可选元组返回类型,并且当数组为空时返回 nil;写法如下:
    func minMax(array: [Int]) -> (min: Int, max: Int?) { ... }
  • 由于元组的成员值已被命名,所以可以通过点语法来检索到最小值或最大值,并且元祖的成员不需要在元祖从函数中返回时命名,因为它们的名字已经在函数返回类型中指定了。
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")

二. 函数的参数

每个函数的参数都有一个参数标签(Argument Label)以及参数名称(Parateter Name)。不指定的情况下,参数名称就是函数参数的参数标签。
参数名称在函数实现中使用;
参数标签在函数调用时使用;
参数标签写在参数名称前面,以空格分开。
一个函数中多个参数的参数名称唯一,参数标签可重复,但不推荐。

1. 参数标签使用:让函数类似自然语言,提高了可读性。
func foo(person name: String, from hometown: String) {
    print(name)
}
foo(person: "lzf", from: "china")
2. 忽略参数标签:如果想隐藏(忽略)参数标签,用下划线_代替。
func someFunc(_ age: Int, height: Double) {}
someFunc(20, height: 178)
3. 默认参数值:通过给参数赋值定义默认参数值,函数调用时可忽略此参数。 
   也可以对此参数重新赋值,调用函数时会出现两个函数提示!
   一般将带有默认值的参数放在最后,函数调用时语意更清晰。如下:
func someFunc(height: Double, age: Int = 20) {}
someFunc(height: 178)
  // 或者
someFunc(height: 180, age: 18)
4. 可变参数:一个可变参数可以接收零个或多个值。
   通过在变量类型名后加...来定义可变参数,
   可变参数的传入值在函数体中变为此类型的数组。
   注意:一个函数中只能有一个可变参数。
 
// 计算一组任意长度数字的算术平均值
func average(_ numbers: Double...) -> Double { 
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
average(1, 2, 37, 48, 19, 199)

输入输出参数:函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误(compile-time error)。这意味着你不能错误地更改参数值。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)。

定义一个输入输出参数时,在参数定义前加 inout 关键字。一个输入输出参数有传入函数的值,这个值被函数修改,然后被传出函数,替换原来的值。想获取更多的关于输入输出参数的细节和相关的编译器优化,请查看输入输出参数一节。

你只能传递变量给输入输出参数。你不能传入常量或者字面量(literal value),因为这些量是不能被修改的。当传入的参数作为输入输出参数时,需要在参数名前加 & 符,表示这个值可以被函数修改。

注意:输入输出参数不能有默认值,而且可变参数不能用 inout 标记!!!

5. 输入输出参数:在变量名前面加 inout 关键字
// 定义函数交换两个整型变量的值
func swapInts(_ a: inout Int, _ b: inout Int) {
    let tempA = a
    a = b
    b = tempA
}

var intA = 3
var intB = 120
swapInts(&intA, &intB)
print("intA = \(intA)\nintB = \(intB) ")

上面的例子中,intA和intB的原始值在函数中被修改了,尽管他们定义在函数体外。注意:输入输出参数和函数返回值时不一样的。上面的函数并没有定义返回值。所以,输入输出参数是函数对函数体外的变量产生影响的方式之一。


三. 函数的类型

在swift中,使用函数类型就像使用其他类型一样。你可以定义一个类型为函数的常量或变量,并将相同类型的函数赋值给它:

func add(_ a: Int, _ b: Int) -> Int { // 加法
    return a + b
}
func multiply(_ a: Int, _ b: Int) -> Int { // 乘法
    return a + b
}
// 1.将add函数赋值给函数变量mathFunc
var mathFunc: (Int, Int) -> Int = add
// 2.然后用mathFunc调用add函数
mathFunc(10, 20)
// 3.也可以将multiply函数赋值给mathFunc,因为它们函数类型一样
mathFunc = multiply
mathFunc(10, 20)
// 4.和其他类型一样,将函数赋值给一个常量或变量时,swift会自动推导类型:
let anotherMathFunc = add // 被推导为(Int, Int) -> Int类型函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 本章将会介绍 控制流For-In 循环While 循环If 条件语句Switch 语句控制转移语句 continu...
    寒桥阅读 711评论 0 0
  • 函数是用来完成特定任务的独立的代码块。给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这...
    穷人家的孩纸阅读 805评论 2 1
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 1,980评论 1 24
  • [The Swift Programming Language 中文版]本页包含内容: 函数是用来完成特定任务的独...
    风林山火阅读 472评论 0 0
  • 我对爱情,有着各种幻想。 年少时,我只是一个普通的女孩,普通到毕业后多年,路遇高中的同学,大家都热烈的打着招呼,却...
    青花古瓷阅读 279评论 0 2