美文网首页
swift 函数 (方法)

swift 函数 (方法)

作者: 奋斗的小马达 | 来源:发表于2021-12-15 15:28 被阅读0次

    一、函数的定义

    注意⚠️:函数参数默认情况下是 let 参数的值是不能更改的
    函数的形式

    func 函数名称(参数)->(返回值类型){
       return  返回值
    }
    

    其中函数参数可有可无,参数的个数可以有一个也可以有多个
    函数的返回值 可有可无 如下例子

    1、无参数、无返回值

    //MARK: -- 没有返回参数的函数
    func sayHello(){
        print("Hellow")
    }
    

    2、有参数 无返回值

    func sayHelloToSomeone(_ name:String){
        print("Hellow \(name)")
    }
    

    3、无参数 有返回值

    func p() -> CGFloat{
        return 3.14
    }
    
    

    4、有参数 有返回值

    func sum(_ v1:Int,_ v2:Int) -> Int{
        return  v1 + v2
    }
    

    二、隐式返回

    如果整个函数体是一个单一表达式,那么函数会隐式返回这个表达式(也就是说可以把关键字 return 省掉 )
    例如

    func sum(_ v1:Int,_ v2:Int) -> Int{
         v1 + v2
    }
    

    三、返回元组:实现多个返回值

    func calculate(v1: Int, v2: Int) -> (sum: Int, difference: Int, average: Int) {
        let sum = v1 + v2
        return (sum, v1 - v2, sum >> 1)
    }
    

    四、函数中的参数标签

    函数中 参数明可以带标签
    例如

    func sum(unmber1 v1:Int,unmber1 v2:Int) -> Int{
        return  v1 + v2
    }
    
    调用方式
    sum(unmber1: 10, unmber1: 20)
    

    这里的 unmber1 和 unmber1 就是参数的标签

    再比如

    func goToWork(at time: String) {
        print("this time is \(time)")
    }
    
    调用方式
    goToWork(at: "08:00")
    

    这里的at 就是参数的标签

    标签的作用就是提示 标签可以使用 _ 来代替

    func sum(_ v1:Int,_ v2:Int) -> Int{
        return  v1 + v2
    }
    

    五、函数中的默认参数

    函数中默认参数指的是赋了初始值的参数,在调用函数的时候 默认参数可传也可不传

    func check(name: String = "nobody", age: Int, job: String = "none") {
    
        print("name=\(name), age=\(age), job=\(job)")
    }
    
    check(name: "Jack", age: 20, job: "Doctor") // name=Jack, age=20, job=Doctor
    check(name: "Rose", age: 18) // name=Rose, age=18, job=none
    check(age: 10, job: "Batman") // name=nobody, age=10, job=Batman
    check(age: 15) // name=nobody, age=15, job=none
    

    如上述函数中 name 、job 都有默认值 age 没有默认值 所以在调用函数的时候 除了age不能为空 其他均可不传

    注意⚠️:函数中有默认参数时 一定要注意 必填参数有时不能省略标签
    比如

    func test(_ first: Int = 10, middle: Int, _ last: Int = 30) { }
    test(middle: 20)
    

    如果上面函数的 middle参数的标签省略 在调用 test函数的时候就不知道你传的参数是哪个 所以会报错
    如下图


    截屏2021-12-15 下午2.50.10.png

    六、函数中的可变参数

    也就是说函数的参数不固定 可以为一个 也可以为多个
    例如

    func sum(_ numbers: Int...) -> Int {
        var total = 0
        for number in numbers {
            total += number
        }
        return total
    }
    
    sum(10, 20, 30, 40)
    

    注意⚠️:
    1、一个函数最多只能有一个可变参数
    2、紧跟在可变参数后面的参数 不能省略标签

    func test(_ numbers: Int..., string: String, _ other: String) { }
    test(10, 20, 30, string: "Jack", "Rose")
    

    test函数的 string 参数不能省略标签

    如果省略就会报错 如下图所示 截屏2021-12-15 下午2.58.53.png

    原因是:如果紧跟在可变参数后面的参数省略了标签 可变参数不知道从哪里结束 然后就把 后面的参数来当成是可变参数 所有就会报错

    七、函数中的输入输出函数(inout)

    可以用inout定义一个输入输出参数:
    作用:可以在函数内部修改外部实参

    例如

    func swapValues(_ v1: inout Int, _ v2: inout Int) {
        let tmp = v1
        v1 = v2
        v2 = tmp
    }
    var num1 = 10
    var num2 = 20
    swapValues(&num1, &num2)
    

    可变参数不能标记为inout
    inout参数不能有默认值
    inout参数只能传入可以被多次赋值的
    inout参数的本质是地址传递(引用传递 也就是将参数的地址传递过去 然后根据地址去修改地址存的值)

    八、函数重载

    规则
    1、函数名相同
    2、参数个数不同 || 参数类型不同 || 参数标签不同

    func sum(v1: Int, v2: Int) -> Int {
        v1 + v2
    }
    

    // 参数个数不同

    func sum(v1: Int, v2: Int, v3: Int) -> Int {
        v1 + v2 + v3
    }
    

    // 参数类型不同

    func sum(v1: Int, v2: Double) -> Double {
        Double(v1) + v2
    }
    

    // 参数类型不同

    func sum(v1: Double, v2: Int) -> Double {
        v1 + Double(v2)
    }
    

    // 参数标签不同

    func sum(_ v1: Int, _ v2: Int) -> Int {
        v1 + v2
    }
    

    // 参数标签不同

    func sum(a: Int, b: Int) -> Int {
        a + b
    }
    

    注意⚠️:
    返回值类型与函数重载无关
    默认参数值和函数重载一起使用产生二义性时,编译器并不会报错(在C++中会报错)
    可变参数、省略参数标签、函数重载一起使用产生二义性时,编译器有可能会报错

    九、內联函数

    使用@inline(never) 修饰函数 这个函数永远不会被内联(即使开启了编译器优化)

    @inline(never) func test() {
      print("test") 
    }
    

    使用@inline(__always) 修饰函数 开启编译器优化后,即使代码很长,也会被内联(递归调用函数、动态派发的函数除外)

    @inline(__always) func test() {
     print("test")
     }
    

    在Release模式下,编译器已经开启优化,会自动决定哪些函数需要内联,因此没必要使用@inline

    相关文章

      网友评论

          本文标题:swift 函数 (方法)

          本文链接:https://www.haomeiwen.com/subject/fzoufrtx.html