Swift学习笔记06:函数

概述

函数是一段执行特定任务的独立的代码块,可以通过函数名来调用这个函数,传递参数给它并获取返回的结果。

定义和调用函数

使用func创建函数:

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}

在上述例子中,()内是函数接收的参数及其数据类型,->后面是函数返回的结果的数据类型。return返回一个值作为结果并退出函数。如果函数没有返回值,也可以用return直接退出,->及后面的数据类型省略。

调用函数时,在函数名后面的()内传递参数,如果有多个参数就用,隔开:

let res = greet(person: "Anna")

如果函数需要返回多个结果,可以将它们放在一个元组中:

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)
}

该元组中的成员会根据函数定义中返回值的名称命名,所以可以通过.和名称来访问:

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")

实际参数标签和形式参数名

形式参数由实际参数标签和形式参数名组成,调用函数时,可以通过实际参数标签和:指定要将参数传递给哪个实参。如果省略了实际参数标签,则用形式参数名作为实际参数标签。

from greet(person: String, from hometown: String) -> String {
    return "Hello \(person)! Glad you could visit from \(hometown)"
}

print(greet(person: "Bill", from: "Cupertino"))

上面例子中,调用时函数传递给了实际参数标签from,但是函数内部处理的变量是hometown,这样可以让函数的调用更加明确,更像自然语句。

如果不希望使用实际参数标签,可以用_显式替换它,这样在调用函数时,传入的参数就会按照顺序一一对应赋给形参。

这里可以理解为,Swift 的参数默认都是关键字参数,和其他语言不同的是每个参数的关键字和名称可以是不一样的,而用_替换掉关键字的才是其它语言中默认的参数形式。

默认参数

=为参数赋一个默认值,就可以在调用时不为这个参数传递一个值,进而使用这个默认值。

func someFunction(age: Int = 12) -> String {
    return "He is \(age)-yeas-old"
}

可变参数

可变参数可以接收 0 或多个特定类型的值,通过在形参的类型名后加...实现。

func average(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}

let res = average(1, 2, 3, 4, 5)

输入输出参数

如果希望函数内对参数的修改在函数结束之后仍然生效,可以在形参的类型前面加inout,并在调用函数时在参数前面加&

func swap(a: inout Int, b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var a = 12
var b = 13
swap(&a, &b)

函数类型

函数也具有类型,所以它也可以像其它类型的变量一样作为函数的参数或返回值。通常将参数的类型放在()里并用,隔开,再把返回值类型放在->后面以表示函数的类型,例如函数接收两个Int类型的参数并返回一个Int类型的结果,它的类型就可以写作(Int, Int) -> Int

如果函数没有返回值,就用Void代替。

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    print("Result: \(mathFunction(a, b))")
}

printMathResult(addTwoInts, 3, 5)

内嵌函数

函数内部可以定义内嵌函数,它们默认被隐藏,但可以通过外部函数来调用它们。

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值