"(表示返回) + 返回类型 备注: 当函数体...">
美文网首页
Swift-函数调用

Swift-函数调用

作者: X_L_F | 来源:发表于2019-09-27 20:22 被阅读0次

    函数

    函数结构

    func关键词 + 函数名 + 形式参数 + "->"(表示返回) + 返回类型

    func sum(number1:Int, numbe2:Int) -> Int {
      number + number // 单一表达式,可省略关键词return
    }
    

    备注

    当函数体位单一表达式是,可以省略关键词return,表示直接返回该单一表达式的值

    无返回值

    无返回值总共有三种写法。

    /**
    * 方式1:直接不写返回类型
    */
    func voidFunc1() {
      print(111)
    }
    
    /**
    *   方式2:返回Void
    */
    func voidFunc2() -> Void {
      print(222)
    }
    
    /**
    *   方式3:返回空元组()
    */
    func voidFunc3() -> () {
      print(333)
    }
    

    备注

    实际上Swift定义中,Void为即为空元组()

    // 官方解释
    public typealias Void = ()
    

    返回多个值

    swift中允许返回多个值,利用元组即可

    /**
    *   例子1:不含标签的元组返回
    */
    func networkStatus() -> (Int, String) {
        (404, "Not Found")          // 方式1
    //  (status:404, msg:"Not Found")   // 方式2
    }
    print(networkStatus())
    // 结果:(404, "Not Found") [无论方式1 or 方式2都一样]
    
    /**
    *   例子2:含标签的元组返回
    */
    func sumAndAvg(number1:Double, number:Double) -> (sum:Double, avg:Double) {
        let sum = number1 + number2
        let avg = sum / 2.0
        return (sum:sum, avg:avg)
    }
    print(sumAndAvg(number1: 1.1, number2:5.1))
    // 结果:(sum:6.2, avg:3.1)
    

    修改标签

    swift提倡代码的阅读星,因此允许修改标签。

    即对外使用最前面的标签,对里使用最后面的标签。且只允许同时并存使用两个标签

    func work(at time:Int) {
      // 为了语time?""
      print("It's \(time) o'clock.It's time to work")
    }
    
    work(at: 9)         // 为了语义通顺,用at
    

    inout参数(引用传递)

    var numner = 10
    func increaseNumber(number:inout Int) {
      number += 1
    }
    
    increaseNumber(number: &number)
    print(number)
    // 结果:11
    

    Inout 关键词只能用于允许允许修改的容易,如var。而像let这种是不允许进行修改的。

    1. 例子

    交换两个值的方式

    var number1 = 1
    var number2 = 2
    
    // 方法1:用inout参数+中间变量
    func exchange(_ v1:inout Int, _ v2:inout Int) {
      le tem = v1
      v1 = v2
      v2 = tem
    }
    exchange(&number1, &number2)
    
    // 方式2:用inout参数+元组(这个方式比较巧)
    func exchange(_ v1:inout Int, _ v2:inout Int) {
      (v2, v1) = (v1, v2)
    }
    
    // 方式3:用官方自带API
    swap(&number1, &number2)
    

    可变参数

    func customPrint(_ intNum:Int...) {
      print(intNum)
    }
    customPrint(1, 2, 3, 4)
    

    注意点

    可变参数后面的参数标签不可省略

    /**
    * 示范:在可变参数后面的参数标签不可省略
    */
    func customPrint(sequeue:Int..., name:String) { // name标签不可省略
      print(sequeue, name)
    }
    customPrint(sequeue:1,2,3,4, name:""66666)
    // 结果:1 2 3 4 6666
    

    函数重载

    跟Java的重载概念一致。

    重载规则:

    1. 参数类型不同

    2. 参数个数不同

    3. 参数便签名称不同

    /**
    * 示范:参数类型不同
    */
    func sum(v1:Double, v2:Int) -> Int {
      Int(v1) + v2
    }
    
    func sum(v2:Int, v3:Int) -> Int {
      v2 + v3
    }
    
    /**
    * 示范:参数个数不同
    */
    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:Int) -> Int {
      v1 + v2
    }
    
    func sum(v2:Int, v3:Int) -> Int {
      v2 + v3
    }
    

    注意

    返回类型不能作为重载的依据(由于在调用的时候,编译会混淆,不知道该调用哪个函数)

    func sum(_ v1:Int, _ v2:Int) -> Int {
      v1 + v2
    }
    
    func sum(_ v1:Int, _ v2:Int) -> Double {
      Double(v1 + v2)
    }
    
    // 无法编译通过,会有歧义
    

    高阶函数

    在返回结果值为另一个函数的函数称为高阶函数

    /**
    *   高阶函数
    */
    // 此处(Int) -> Int 为该walk函数的返回值
    
    func walk(_ isForward:Bool) -> ((Int) -> Int) {
      isForward ? forward: back
    } 
    
    func forward(step:Int) -> Int {
      return step
    }
    
    func back(step:Int) -> Int {
      return -step
    }
    
    // 调用方式1
    print(walk(false)(1))
    
    // 调用方式2
    var customForward = walk(false)
    print(customForward(1))
    

    注意

    函数返回值不允许带有标签。就算是函数类型的结果值也不予许带

    /**
    * 错误释放
    */
    // (Int) -> Int 不予许变成 (step:Int) -> Int。函数返回值不允许带标签
    func walk(_ isForward:Bool) -> ((step:Int) -> Int) {
      isForward ? forward: back
    } 
    
    func forward(step:Int) -> Int {
      return step
    }
    
    func back(step:Int) -> Int {
      return -step
    }
    

    嵌套函数

    函数内嵌套函数

    func walk(isForward:Bool, step:Int) {
      func fowrd(_ step:Int) {
        print(step)
      }
      
      func back(_ step:Int) {
        print(step)
      }
      
      isForward ? forward(step) : back(step)
    }
    walk(isForward:true, step:1)
    // 结果:1
    

    相关文章

      网友评论

          本文标题:Swift-函数调用

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