四、swift3.0函数的使用

来源:互联网 发布:zeppelin 修改端口 编辑:程序博客网 时间:2024/06/05 16:11
一、函数的定义和调用函数

函数是执行特定任务的一段代码,函数是代码复用的重要手段,swift中的函数比C语言的函数更加强大。

在swift中,如果把函数放在枚举、结构体、类以外定义,则称为函数;如果放在类、结构体、枚举之内定义则称为方法。

定义函数的格式:

func name(parameters) -> <return type> {        function body    }
func ma_x(x: Int, y: Int) -> Int {    let z = x > y ? x : y    return z}let x = ma_x(x: 10, y: 20)
//定义没有返回值的函数func test1(Int: x) -> () {    print(x + 10)}func test2(Int: y) -> Void {    print(y)}func test3(Int: z) {    print(z)}

//定义没有参数的函数func test_1() -> String {    return "123"}//定义没有参数没有返回值的函数func test_2() {    print(“456”)}//返回多个参数,把返回值类型定义为元组类型即可func test1(a : Int, b : Int) -> (Int, Int) {    return(a+b, a-b)}

二、swift中函数的其它使用方法
1、递归函数:一个函数体内调用它自身的函数成为称为递归函数,递归函数内部包含了一种循环,在使用递归函数时,必须在某个时刻函数的返回值是确定的,避免出现死循环。

func test(a: Int) -> Int {        if a == 0 {            return 1        } else if a == 1 {            return 4        } else {            return 2 * test(a: a - 1) + test(a: a - 2)        }    }

2、设置函数形参默认值,便于调用函数时可以省略该形参

func test(a: Int = 9, b: Int = 10) -> Int {    return a+b}test()test(a: 1)test(b: 2)

3、形式参数个数可变

func test(socre: String..., age: Int) -> Int {                for str in socre {            print(str)        }        return age + 1    }    test(socre: "123", "234", age: 23)

4、In-Out形参
在swift函数中,如果其形参是值类型,那么在函数体中无法改变其传入参数的值;如果参数是引用类型,则可以在函数体内对参数本身进行修改。
inout关键字可以把外部值类型的参数传入到函数内,这样就可以修改其值。

func swap(a: inout Int, b: inout Int) {    let temp = a    a = b    b = temp}var a = 3var b = 12swap(&a, &b)

注:不管是值类型参数、引用类型参数,swift都只是将参数的副本传入函数内,只不过值类型的参数所传递的是值本身的副本,而引用类型的参数传入引用的副本,引用对象本身并没有生成副本。


5、函数类型:类似于C语言的函数指针,但swift更简单易懂
5.1、把函数赋值给一个变量
可以使该变量在不同时间指向不同的函数,使得程序更灵活

func pow(a: Int, b: Int) -> Int {    return a + b}var myFun : (Int, Int) -> IntmyFun = powprint(myFun(1, 2))

5.2、函数类型作为函数的参数
当函数的大部分计算逻辑都可以确定,某些处理逻辑需要随机变动,则需要函数类型作为该函数的参数

func test(data : [Int], fn : (Int) -> Int) -> [Int] {        var data = data    for i in data {        data[i] = fn(data[i])    }    return data}//计算和func sum1(a: Int) -> Int {    return a+1}//计算平方func square1(a: Int) -> Int {    return a*a}test(data: [1, 2, 3], fn: sum1)test(data: [4, 5, 6], fn: square1)

6、使用函数类型作为返回值类型

func sum1(a: Int) -> Int{        return a + a    }        func sque(a: Int) -> Int {        return a*a    }        func getFunc(type : String) -> (Int) -> Int {        switch type {        case "12":            return sum1        default:            return sque        }    }

三、函数的重载
swift中允许定义多个同名的函数,只要形参列表或者返回值类型不同即可

func test() {        print("空空如也")    }            func test(a: String) {        print("有点东西")    }        //这样写不对,不知道为什么    func test() -> String {        print("来个返回值")        return "123"    }        //当形参长度可变时,会造成程序不知道调用那一个重载函数    func test(a: String...) {        for b in a {            print(b)        }    }